2 * ============LICENSE_START=======================================================
3 * dcaegen2-collectors-veshv
4 * ================================================================================
5 * Copyright (C) 2018 NOKIA
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.onap.dcae.collectors.veshv.utils.logging
22 import ch.qos.logback.classic.LoggerContext
23 import kotlin.reflect.KClass
24 import org.slf4j.LoggerFactory
27 typealias MappedDiagnosticContext = () -> Map<String, String>
29 @Suppress("TooManyFunctions", "SuboptimalLoggerUsage")
30 class Logger(logger: org.slf4j.Logger) {
31 constructor(clazz: KClass<out Any>) : this(LoggerFactory.getLogger(clazz.java))
32 constructor(name: String) : this(LoggerFactory.getLogger(name))
34 private val errorLogger = if (logger.isErrorEnabled) ErrorLevelLogger(logger) else OffLevelLogger
35 private val warnLogger = if (logger.isWarnEnabled) WarnLevelLogger(logger) else OffLevelLogger
36 private val infoLogger = if (logger.isInfoEnabled) InfoLevelLogger(logger) else OffLevelLogger
37 private val debugLogger = if (logger.isDebugEnabled) DebugLevelLogger(logger) else OffLevelLogger
38 private val traceLogger = if (logger.isTraceEnabled) TraceLevelLogger(logger) else OffLevelLogger
42 fun withError(block: AtLevelLogger.() -> Unit) = errorLogger.block()
44 fun withError(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
45 errorLogger.withMdc(mdc, block)
47 fun error(message: () -> String) = errorLogger.run {
51 fun error(mdc: MappedDiagnosticContext, message: () -> String) =
52 errorLogger.withMdc(mdc) { log(message()) }
54 fun error(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
55 errorLogger.withMdc(mdc) { log(marker, message()) }
59 fun withWarn(block: AtLevelLogger.() -> Unit) = warnLogger.block()
61 fun withWarn(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
62 warnLogger.withMdc(mdc, block)
64 fun warn(message: () -> String) = warnLogger.run {
68 fun warn(mdc: MappedDiagnosticContext, message: () -> String) =
69 warnLogger.withMdc(mdc) { log(message()) }
71 fun warn(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
72 warnLogger.withMdc(mdc) { log(marker, message()) }
76 fun withInfo(block: AtLevelLogger.() -> Unit) = infoLogger.block()
78 fun withInfo(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
79 infoLogger.withMdc(mdc, block)
81 fun info(message: () -> String) = infoLogger.run {
85 fun info(mdc: MappedDiagnosticContext, message: () -> String) =
86 infoLogger.withMdc(mdc) { log(message()) }
88 fun info(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
89 infoLogger.withMdc(mdc) { log(marker, message()) }
93 fun withDebug(block: AtLevelLogger.() -> Unit) = debugLogger.block()
95 fun withDebug(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
96 debugLogger.withMdc(mdc, block)
98 fun debug(message: () -> String) = debugLogger.run {
102 fun debug(mdc: MappedDiagnosticContext, message: () -> String) =
103 debugLogger.withMdc(mdc) { log(message()) }
105 fun debug(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
106 debugLogger.withMdc(mdc) { log(marker, message()) }
110 fun withTrace(block: AtLevelLogger.() -> Unit) = traceLogger.block()
112 fun withTrace(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
113 traceLogger.withMdc(mdc, block)
115 fun trace(message: () -> String) = traceLogger.run {
119 fun trace(mdc: MappedDiagnosticContext, message: () -> String) =
120 traceLogger.withMdc(mdc) { log(message()) }
122 fun trace(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
123 traceLogger.withMdc(mdc) { log(marker, message()) }
126 fun setLogLevel(packageName: String, level: LogLevel) {
127 val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
128 loggerContext.getLogger(packageName).level = level()
133 abstract class AtLevelLogger {
134 abstract fun log(message: String)
135 abstract fun log(message: String, t: Throwable)
136 abstract fun log(marker: Marker, message: String)
138 open val enabled: Boolean
141 inline fun withMdc(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) {
144 MDC.setContextMap(mdc())
152 protected fun withAdditionalMdc(mdc: Map<String, String>, block: () -> Unit) {
157 mdc.forEach(MDC::put)
160 mdc.keys.forEach(MDC::remove)
166 object OffLevelLogger : AtLevelLogger() {
167 override val enabled = false
169 override fun log(message: String) {
170 // do not log anything
173 override fun log(message: String, t: Throwable) {
174 // do not log anything
177 override fun log(marker: Marker, message: String) {
178 // do not log anything
182 @Suppress("SuboptimalLoggerUsage")
183 class ErrorLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
184 override fun log(message: String) {
185 logger.error(message)
188 override fun log(message: String, t: Throwable) {
189 logger.error(message, t)
192 override fun log(marker: Marker, message: String) =
193 withAdditionalMdc(marker.mdc) {
194 logger.error(marker.slf4jMarker, message)
198 @Suppress("SuboptimalLoggerUsage")
199 class WarnLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
200 override fun log(message: String) {
204 override fun log(message: String, t: Throwable) {
205 logger.warn(message, t)
208 override fun log(marker: Marker, message: String) =
209 withAdditionalMdc(marker.mdc) {
210 logger.warn(marker.slf4jMarker, message)
214 @Suppress("SuboptimalLoggerUsage")
215 class InfoLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
216 override fun log(message: String) {
220 override fun log(message: String, t: Throwable) {
221 logger.info(message, t)
224 override fun log(marker: Marker, message: String) =
225 withAdditionalMdc(marker.mdc) {
226 logger.info(marker.slf4jMarker, message)
230 @Suppress("SuboptimalLoggerUsage")
231 class DebugLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
232 override fun log(message: String) {
233 logger.debug(message)
236 override fun log(message: String, t: Throwable) {
237 logger.debug(message, t)
240 override fun log(marker: Marker, message: String) =
241 withAdditionalMdc(marker.mdc) {
242 logger.debug(marker.slf4jMarker, message)
246 @Suppress("SuboptimalLoggerUsage")
247 class TraceLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
248 override fun log(message: String) {
249 logger.trace(message)
252 override fun log(message: String, t: Throwable) {
253 logger.trace(message, t)
256 override fun log(marker: Marker, message: String) =
257 withAdditionalMdc(marker.mdc) {
258 logger.trace(marker.slf4jMarker, message)