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
26 import org.slf4j.Marker
28 typealias MappedDiagnosticContext = () -> Map<String, String>
30 @Suppress("TooManyFunctions", "SuboptimalLoggerUsage")
31 class Logger(logger: org.slf4j.Logger) {
32 constructor(clazz: KClass<out Any>) : this(LoggerFactory.getLogger(clazz.java))
33 constructor(name: String) : this(LoggerFactory.getLogger(name))
35 private val errorLogger by lazy {
36 if (logger.isErrorEnabled) ErrorLevelLogger(logger) else OffLevelLogger
38 private val warnLogger by lazy {
39 if (logger.isWarnEnabled) WarnLevelLogger(logger) else OffLevelLogger
41 private val infoLogger by lazy {
42 if (logger.isInfoEnabled) InfoLevelLogger(logger) else OffLevelLogger
44 private val debugLogger by lazy {
45 if (logger.isDebugEnabled) DebugLevelLogger(logger) else OffLevelLogger
47 private val traceLogger by lazy {
48 if (logger.isTraceEnabled) TraceLevelLogger(logger) else OffLevelLogger
53 fun withError(block: AtLevelLogger.() -> Unit) = errorLogger.block()
55 fun withError(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
56 errorLogger.withMdc(mdc, block)
58 fun error(message: () -> String) = errorLogger.run {
62 fun error(mdc: MappedDiagnosticContext, message: () -> String) =
63 errorLogger.withMdc(mdc) { log(message()) }
67 fun withWarn(block: AtLevelLogger.() -> Unit) = warnLogger.block()
69 fun withWarn(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
70 warnLogger.withMdc(mdc, block)
72 fun warn(message: () -> String) = warnLogger.run {
76 fun warn(mdc: MappedDiagnosticContext, message: () -> String) =
77 warnLogger.withMdc(mdc) { log(message()) }
81 fun withInfo(block: AtLevelLogger.() -> Unit) = infoLogger.block()
83 fun withInfo(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
84 infoLogger.withMdc(mdc, block)
86 fun info(message: () -> String) = infoLogger.run {
90 fun info(mdc: MappedDiagnosticContext, message: () -> String) =
91 infoLogger.withMdc(mdc) { log(message()) }
95 fun withDebug(block: AtLevelLogger.() -> Unit) = debugLogger.block()
97 fun withDebug(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
98 debugLogger.withMdc(mdc, block)
100 fun debug(message: () -> String) = debugLogger.run {
104 fun debug(mdc: MappedDiagnosticContext, message: () -> String) =
105 debugLogger.withMdc(mdc) { log(message()) }
109 fun withTrace(block: AtLevelLogger.() -> Unit) = traceLogger.block()
111 fun withTrace(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) =
112 traceLogger.withMdc(mdc, block)
114 fun trace(message: () -> String) = traceLogger.run {
118 fun trace(mdc: MappedDiagnosticContext, message: () -> String) =
119 traceLogger.withMdc(mdc) { log(message()) }
122 fun setLogLevel(packageName: String, level: LogLevel) {
123 val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext
124 loggerContext.getLogger(packageName).level = level()
129 abstract class AtLevelLogger {
130 abstract fun log(message: String)
131 abstract fun log(message: String, t: Throwable)
132 abstract fun log(marker: Marker, message: String)
133 abstract fun log(marker: Marker, message: String, t: Throwable)
135 open val enabled: Boolean
138 inline fun withMdc(mdc: MappedDiagnosticContext, block: AtLevelLogger.() -> Unit) {
141 MDC.setContextMap(mdc())
150 object OffLevelLogger : AtLevelLogger() {
151 override val enabled = false
153 override fun log(message: String) {
154 // do not log anything
157 override fun log(message: String, t: Throwable) {
158 // do not log anything
161 override fun log(marker: Marker, message: String) {
162 // do not log anything
165 override fun log(marker: Marker, message: String, t: Throwable) {
166 // do no log anything
170 @Suppress("SuboptimalLoggerUsage")
171 class ErrorLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
172 override fun log(message: String) {
173 logger.error(message)
176 override fun log(message: String, t: Throwable) {
177 logger.error(message, t)
180 override fun log(marker: Marker, message: String) =
181 logger.error(marker, message)
183 override fun log(marker: Marker, message: String, t: Throwable) =
184 logger.error(marker, message, t)
187 @Suppress("SuboptimalLoggerUsage")
188 class WarnLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
189 override fun log(message: String) {
193 override fun log(message: String, t: Throwable) {
194 logger.warn(message, t)
197 override fun log(marker: Marker, message: String) =
198 logger.warn(marker, message)
200 override fun log(marker: Marker, message: String, t: Throwable) =
201 logger.warn(marker, message, t)
204 @Suppress("SuboptimalLoggerUsage")
205 class InfoLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
206 override fun log(message: String) {
210 override fun log(message: String, t: Throwable) {
211 logger.info(message, t)
214 override fun log(marker: Marker, message: String) =
215 logger.info(marker, message)
217 override fun log(marker: Marker, message: String, t: Throwable) =
218 logger.info(marker, message, t)
221 @Suppress("SuboptimalLoggerUsage")
222 class DebugLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
223 override fun log(message: String) {
224 logger.debug(message)
227 override fun log(message: String, t: Throwable) {
228 logger.debug(message, t)
231 override fun log(marker: Marker, message: String) =
232 logger.debug(marker, message)
234 override fun log(marker: Marker, message: String, t: Throwable) =
235 logger.debug(marker, message, t)
238 @Suppress("SuboptimalLoggerUsage")
239 class TraceLevelLogger(private val logger: org.slf4j.Logger) : AtLevelLogger() {
240 override fun log(message: String) {
241 logger.trace(message)
244 override fun log(message: String, t: Throwable) {
245 logger.trace(message, t)
248 override fun log(marker: Marker, message: String) =
249 logger.trace(marker, message)
251 override fun log(marker: Marker, message: String, t: Throwable) =
252 logger.trace(marker, message, t)