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 by lazy {
35 if (logger.isErrorEnabled) ErrorLevelLogger(logger) else OffLevelLogger
37 private val warnLogger by lazy {
38 if (logger.isWarnEnabled) WarnLevelLogger(logger) else OffLevelLogger
40 private val infoLogger by lazy {
41 if (logger.isInfoEnabled) InfoLevelLogger(logger) else OffLevelLogger
43 private val debugLogger by lazy {
44 if (logger.isDebugEnabled) DebugLevelLogger(logger) else OffLevelLogger
46 private val traceLogger by lazy {
47 if (logger.isTraceEnabled) TraceLevelLogger(logger) else OffLevelLogger
52 fun withError(block: AtLevelLogger.() -> Unit) = errorLogger.block()
54 fun withError(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
55 errorLogger.withMdc(mdc, block)
57 fun error(message: () -> String) = errorLogger.run {
61 fun error(mdc: MappedDiagnosticContext, message: () -> String) =
62 errorLogger.withMdc(mdc) { log(message()) }
64 fun error(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
65 errorLogger.withMdc(mdc) { log(marker, message()) }
67 fun error(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String, t: Throwable) =
68 errorLogger.withMdc(mdc) { log(marker, message(), t) }
72 fun withWarn(block: AtLevelLogger.() -> Unit) = warnLogger.block()
74 fun withWarn(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
75 warnLogger.withMdc(mdc, block)
77 fun warn(message: () -> String) = warnLogger.run {
81 fun warn(mdc: MappedDiagnosticContext, message: () -> String) =
82 warnLogger.withMdc(mdc) { log(message()) }
84 fun warn(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
85 warnLogger.withMdc(mdc) { log(marker, message()) }
87 fun warn(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String, t: Throwable) =
88 warnLogger.withMdc(mdc) { log(marker, message(), t) }
92 fun withInfo(block: AtLevelLogger.() -> Unit) = infoLogger.block()
94 fun withInfo(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
95 infoLogger.withMdc(mdc, block)
97 fun info(message: () -> String) = infoLogger.run {
101 fun info(mdc: MappedDiagnosticContext, message: () -> String) =
102 infoLogger.withMdc(mdc) { log(message()) }
104 fun info(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
105 infoLogger.withMdc(mdc) { log(marker, message()) }
109 fun withDebug(block: AtLevelLogger.() -> Unit) = debugLogger.block()
111 fun withDebug(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
112 debugLogger.withMdc(mdc, block)
114 fun debug(message: () -> String) = debugLogger.run {
118 fun debug(mdc: MappedDiagnosticContext, message: () -> String) =
119 debugLogger.withMdc(mdc) { log(message()) }
121 fun debug(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
122 debugLogger.withMdc(mdc) { log(marker, message()) }
126 fun withTrace(block: AtLevelLogger.() -> Unit) = traceLogger.block()
128 fun withTrace(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
129 traceLogger.withMdc(mdc, block)
131 fun trace(message: () -> String) = traceLogger.run {
135 fun trace(mdc: MappedDiagnosticContext, message: () -> String) =
136 traceLogger.withMdc(mdc) { log(message()) }
138 fun trace(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
139 traceLogger.withMdc(mdc) { log(marker, message()) }
142 fun setLogLevel(packageName: String, level: LogLevel) {
143 val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
144 loggerContext.getLogger(packageName).level = level()
149 abstract class AtLevelLogger {
150 abstract fun log(message: String)
151 abstract fun log(message: String, t: Throwable)
152 abstract fun log(marker: Marker, message: String)
153 abstract fun log(marker: Marker, message: String, t: Throwable)
155 open val enabled: Boolean
158 inline fun withMdc(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) {
161 MDC.setContextMap(mdc())
169 protected fun withAdditionalMdc(mdc: Map<String, String>, block: () -> Unit) {
174 mdc.forEach(MDC::put)
177 mdc.keys.forEach(MDC::remove)
183 object OffLevelLogger : AtLevelLogger() {
184 override val enabled = false
186 override fun log(message: String) {
187 // do not log anything
190 override fun log(message: String, t: Throwable) {
191 // do not log anything
194 override fun log(marker: Marker, message: String) {
195 // do not log anything
198 override fun log(marker: Marker, message: String, t: Throwable) {
199 // do no log anything
203 @Suppress("SuboptimalLoggerUsage")
204 class ErrorLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
205 override fun log(message: String) {
206 logger.error(message)
209 override fun log(message: String, t: Throwable) {
210 logger.error(message, t)
213 override fun log(marker: Marker, message: String) =
214 withAdditionalMdc(marker.mdc) {
215 logger.error(marker.slf4jMarker, message)
218 override fun log(marker: Marker, message: String, t: Throwable) =
219 withAdditionalMdc(marker.mdc) {
220 logger.error(marker.slf4jMarker, message, t)
224 @Suppress("SuboptimalLoggerUsage")
225 class WarnLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
226 override fun log(message: String) {
230 override fun log(message: String, t: Throwable) {
231 logger.warn(message, t)
234 override fun log(marker: Marker, message: String) =
235 withAdditionalMdc(marker.mdc) {
236 logger.warn(marker.slf4jMarker, message)
239 override fun log(marker: Marker, message: String, t: Throwable) =
240 withAdditionalMdc(marker.mdc) {
241 logger.warn(marker.slf4jMarker, message, t)
245 @Suppress("SuboptimalLoggerUsage")
246 class InfoLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
247 override fun log(message: String) {
251 override fun log(message: String, t: Throwable) {
252 logger.info(message, t)
255 override fun log(marker: Marker, message: String) =
256 withAdditionalMdc(marker.mdc) {
257 logger.info(marker.slf4jMarker, message)
260 override fun log(marker: Marker, message: String, t: Throwable) =
261 withAdditionalMdc(marker.mdc) {
262 logger.info(marker.slf4jMarker, message, t)
266 @Suppress("SuboptimalLoggerUsage")
267 class DebugLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
268 override fun log(message: String) {
269 logger.debug(message)
272 override fun log(message: String, t: Throwable) {
273 logger.debug(message, t)
276 override fun log(marker: Marker, message: String) =
277 withAdditionalMdc(marker.mdc) {
278 logger.debug(marker.slf4jMarker, message)
281 override fun log(marker: Marker, message: String, t: Throwable) =
282 withAdditionalMdc(marker.mdc) {
283 logger.debug(marker.slf4jMarker, message, t)
287 @Suppress("SuboptimalLoggerUsage")
288 class TraceLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
289 override fun log(message: String) {
290 logger.trace(message)
293 override fun log(message: String, t: Throwable) {
294 logger.trace(message, t)
297 override fun log(marker: Marker, message: String) =
298 withAdditionalMdc(marker.mdc) {
299 logger.trace(marker.slf4jMarker, message)
302 override fun log(marker: Marker, message: String, t: Throwable) =
303 withAdditionalMdc(marker.mdc) {
304 logger.trace(marker.slf4jMarker, message, t)