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()) }
69 fun withWarn(block: AtLevelLogger.() -> Unit) = warnLogger.block()
71 fun withWarn(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
72 warnLogger.withMdc(mdc, block)
74 fun warn(message: () -> String) = warnLogger.run {
78 fun warn(mdc: MappedDiagnosticContext, message: () -> String) =
79 warnLogger.withMdc(mdc) { log(message()) }
81 fun warn(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
82 warnLogger.withMdc(mdc) { log(marker, message()) }
86 fun withInfo(block: AtLevelLogger.() -> Unit) = infoLogger.block()
88 fun withInfo(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
89 infoLogger.withMdc(mdc, block)
91 fun info(message: () -> String) = infoLogger.run {
95 fun info(mdc: MappedDiagnosticContext, message: () -> String) =
96 infoLogger.withMdc(mdc) { log(message()) }
98 fun info(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
99 infoLogger.withMdc(mdc) { log(marker, message()) }
103 fun withDebug(block: AtLevelLogger.() -> Unit) = debugLogger.block()
105 fun withDebug(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
106 debugLogger.withMdc(mdc, block)
108 fun debug(message: () -> String) = debugLogger.run {
112 fun debug(mdc: MappedDiagnosticContext, message: () -> String) =
113 debugLogger.withMdc(mdc) { log(message()) }
115 fun debug(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
116 debugLogger.withMdc(mdc) { log(marker, message()) }
120 fun withTrace(block: AtLevelLogger.() -> Unit) = traceLogger.block()
122 fun withTrace(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
123 traceLogger.withMdc(mdc, block)
125 fun trace(message: () -> String) = traceLogger.run {
129 fun trace(mdc: MappedDiagnosticContext, message: () -> String) =
130 traceLogger.withMdc(mdc) { log(message()) }
132 fun trace(mdc: MappedDiagnosticContext, marker: Marker, message: () -> String) =
133 traceLogger.withMdc(mdc) { log(marker, message()) }
136 fun setLogLevel(packageName: String, level: LogLevel) {
137 val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
138 loggerContext.getLogger(packageName).level = level()
143 abstract class AtLevelLogger {
144 abstract fun log(message: String)
145 abstract fun log(message: String, t: Throwable)
146 abstract fun log(marker: Marker, message: String)
148 open val enabled: Boolean
151 inline fun withMdc(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) {
154 MDC.setContextMap(mdc())
162 protected fun withAdditionalMdc(mdc: Map<String, String>, block: () -> Unit) {
167 mdc.forEach(MDC::put)
170 mdc.keys.forEach(MDC::remove)
176 object OffLevelLogger : AtLevelLogger() {
177 override val enabled = false
179 override fun log(message: String) {
180 // do not log anything
183 override fun log(message: String, t: Throwable) {
184 // do not log anything
187 override fun log(marker: Marker, message: String) {
188 // do not log anything
192 @Suppress("SuboptimalLoggerUsage")
193 class ErrorLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
194 override fun log(message: String) {
195 logger.error(message)
198 override fun log(message: String, t: Throwable) {
199 logger.error(message, t)
202 override fun log(marker: Marker, message: String) =
203 withAdditionalMdc(marker.mdc) {
204 logger.error(marker.slf4jMarker, message)
208 @Suppress("SuboptimalLoggerUsage")
209 class WarnLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
210 override fun log(message: String) {
214 override fun log(message: String, t: Throwable) {
215 logger.warn(message, t)
218 override fun log(marker: Marker, message: String) =
219 withAdditionalMdc(marker.mdc) {
220 logger.warn(marker.slf4jMarker, message)
224 @Suppress("SuboptimalLoggerUsage")
225 class InfoLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
226 override fun log(message: String) {
230 override fun log(message: String, t: Throwable) {
231 logger.info(message, t)
234 override fun log(marker: Marker, message: String) =
235 withAdditionalMdc(marker.mdc) {
236 logger.info(marker.slf4jMarker, message)
240 @Suppress("SuboptimalLoggerUsage")
241 class DebugLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
242 override fun log(message: String) {
243 logger.debug(message)
246 override fun log(message: String, t: Throwable) {
247 logger.debug(message, t)
250 override fun log(marker: Marker, message: String) =
251 withAdditionalMdc(marker.mdc) {
252 logger.debug(marker.slf4jMarker, message)
256 @Suppress("SuboptimalLoggerUsage")
257 class TraceLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
258 override fun log(message: String) {
259 logger.trace(message)
262 override fun log(message: String, t: Throwable) {
263 logger.trace(message, t)
266 override fun log(marker: Marker, message: String) =
267 withAdditionalMdc(marker.mdc) {
268 logger.trace(marker.slf4jMarker, message)