Skip to content

Commit

Permalink
move logic to abstraction Slf4jLogger
Browse files Browse the repository at this point in the history
Split cases to with / without payload.
  • Loading branch information
oshai committed Jul 12, 2023
1 parent cc90ea7 commit ac65cc9
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,6 @@ public fun Level.toSlf4j(): org.slf4j.event.Level =
Level.OFF -> throw IllegalArgumentException("OFF level is not supported")
}

public fun Logger.isLoggingEnabledFor(level: Level, marker: Marker?): Boolean {
return when (level) {
Level.TRACE -> this.isTraceEnabled(marker?.toSlf4j())
Level.DEBUG -> this.isDebugEnabled(marker?.toSlf4j())
Level.INFO -> this.isInfoEnabled(marker?.toSlf4j())
Level.WARN -> this.isWarnEnabled(marker?.toSlf4j())
Level.ERROR -> this.isErrorEnabled(marker?.toSlf4j())
Level.OFF -> false
}
}

@Suppress("UnusedReceiverParameter")
public fun KotlinLogging.logger(underlyingLogger: Logger): KLogger =
Slf4jLoggerFactory.wrapJLogger(underlyingLogger)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import io.github.oshai.kotlinlogging.KLoggingEventBuilder
import io.github.oshai.kotlinlogging.Level
import io.github.oshai.kotlinlogging.Marker
import io.github.oshai.kotlinlogging.internal.toStringSafe
import io.github.oshai.kotlinlogging.slf4j.isLoggingEnabledFor
import io.github.oshai.kotlinlogging.slf4j.toSlf4j
import org.slf4j.event.EventConstants
import org.slf4j.helpers.MessageFormatter
Expand All @@ -17,9 +16,10 @@ import org.slf4j.spi.LocationAwareLogger
* correct fully qualified class name.
*/
internal class LocationAwareKLogger(override val underlyingLogger: LocationAwareLogger) :
KLogger, DelegatingKLogger<LocationAwareLogger>, Slf4jLogger() {
KLogger, DelegatingKLogger<LocationAwareLogger>, Slf4jLogger<LocationAwareLogger>() {
override val fqcn: String?
get() = LocationAwareKLogger::class.java.name

private val fqcn: String = LocationAwareKLogger::class.java.name
private val ENTRY = io.github.oshai.kotlinlogging.KMarkerFactory.getMarker("ENTRY").toSlf4j()
private val EXIT = io.github.oshai.kotlinlogging.KMarkerFactory.getMarker("EXIT").toSlf4j()

Expand All @@ -29,19 +29,20 @@ internal class LocationAwareKLogger(override val underlyingLogger: LocationAware
io.github.oshai.kotlinlogging.KMarkerFactory.getMarker("CATCHING").toSlf4j()
private val EXITONLY = "exit"
private val EXITMESSAGE = "exit with ({})"
override val name: String
get() = underlyingLogger.name

override fun at(level: Level, marker: Marker?, block: KLoggingEventBuilder.() -> Unit) {
if (isLoggingEnabledFor(level, marker)) {
KLoggingEventBuilder().apply(block).run {
underlyingLogger.log(marker?.toSlf4j(), fqcn, level.toSlf4j().toInt(), message, null, cause)
}
}
}

override fun isLoggingEnabledFor(level: Level, marker: Marker?): Boolean {
return underlyingLogger.isLoggingEnabledFor(level, marker)
override fun logWithoutPayload(
kLoggingEventBuilder: KLoggingEventBuilder,
level: Level,
marker: Marker?
) {
underlyingLogger.log(
marker?.toSlf4j(),
fqcn,
level.toSlf4j().toInt(),
kLoggingEventBuilder.message,
null,
kLoggingEventBuilder.cause
)
}

override fun <T : Throwable> catching(throwable: T) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KLoggingEventBuilder
import io.github.oshai.kotlinlogging.Level
import io.github.oshai.kotlinlogging.Marker
import io.github.oshai.kotlinlogging.slf4j.isLoggingEnabledFor
import io.github.oshai.kotlinlogging.slf4j.toSlf4j
import org.slf4j.Logger

Expand All @@ -15,23 +14,48 @@ import org.slf4j.Logger
* methods
*/
internal class LocationIgnorantKLogger(override val underlyingLogger: Logger) :
KLogger, DelegatingKLogger<Logger>, Slf4jLogger() {
override val name: String
get() = underlyingLogger.name
KLogger, DelegatingKLogger<Logger>, Slf4jLogger<Logger>() {

override fun at(level: Level, marker: Marker?, block: KLoggingEventBuilder.() -> Unit) {
if (isLoggingEnabledFor(level, marker)) {
KLoggingEventBuilder().apply(block).run {
val builder = underlyingLogger.atLevel(level.toSlf4j())
marker?.toSlf4j()?.let { builder.addMarker(it) }
payload?.forEach { (key, value) -> builder.addKeyValue(key, value) }
builder.setCause(cause)
builder.log(message)
}
}
}
override val fqcn: String?
get() = null

override fun isLoggingEnabledFor(level: Level, marker: Marker?): Boolean {
return underlyingLogger.isLoggingEnabledFor(level, marker)
override fun logWithoutPayload(
kLoggingEventBuilder: KLoggingEventBuilder,
level: Level,
marker: Marker?
) {
when (level) {
Level.TRACE ->
underlyingLogger.trace(
marker?.toSlf4j(),
kLoggingEventBuilder.message,
kLoggingEventBuilder.cause
)
Level.DEBUG ->
underlyingLogger.debug(
marker?.toSlf4j(),
kLoggingEventBuilder.message,
kLoggingEventBuilder.cause
)
Level.INFO ->
underlyingLogger.info(
marker?.toSlf4j(),
kLoggingEventBuilder.message,
kLoggingEventBuilder.cause
)
Level.WARN ->
underlyingLogger.warn(
marker?.toSlf4j(),
kLoggingEventBuilder.message,
kLoggingEventBuilder.cause
)
Level.ERROR ->
underlyingLogger.error(
marker?.toSlf4j(),
kLoggingEventBuilder.message,
kLoggingEventBuilder.cause
)
Level.OFF -> Unit
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,61 @@
package io.github.oshai.kotlinlogging.slf4j.internal

import io.github.oshai.kotlinlogging.DelegatingKLogger
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KLoggingEventBuilder
import io.github.oshai.kotlinlogging.Level
import io.github.oshai.kotlinlogging.Marker
import io.github.oshai.kotlinlogging.slf4j.toSlf4j
import org.slf4j.Logger
import org.slf4j.spi.CallerBoundaryAware

public abstract class Slf4jLogger : KLogger {}
public abstract class Slf4jLogger<T : Logger> : KLogger, DelegatingKLogger<T> {

override val name: String
get() = underlyingLogger.name

protected abstract val fqcn: String?
override fun at(level: Level, marker: Marker?, block: KLoggingEventBuilder.() -> Unit) {
if (isLoggingEnabledFor(level, marker)) {
KLoggingEventBuilder().apply(block).run {
if (payload != null) {
logWithPayload(this, level, marker)
} else {
logWithoutPayload(this, level, marker)
}
}
}
}

protected abstract fun logWithoutPayload(
kLoggingEventBuilder: KLoggingEventBuilder,
level: Level,
marker: Marker?
)

private fun logWithPayload(
kLoggingEventBuilder: KLoggingEventBuilder,
level: Level,
marker: Marker?
) {
val builder = underlyingLogger.atLevel(level.toSlf4j())
marker?.toSlf4j()?.let { builder.addMarker(it) }
kLoggingEventBuilder.payload?.forEach { (key, value) -> builder.addKeyValue(key, value) }
builder.setCause(kLoggingEventBuilder.cause)
if (builder is CallerBoundaryAware) {
builder.setCallerBoundary(fqcn)
}
builder.log(kLoggingEventBuilder.message)
}

override fun isLoggingEnabledFor(level: Level, marker: Marker?): Boolean {
return when (level) {
Level.TRACE -> underlyingLogger.isTraceEnabled(marker?.toSlf4j())
Level.DEBUG -> underlyingLogger.isDebugEnabled(marker?.toSlf4j())
Level.INFO -> underlyingLogger.isInfoEnabled(marker?.toSlf4j())
Level.WARN -> underlyingLogger.isWarnEnabled(marker?.toSlf4j())
Level.ERROR -> underlyingLogger.isErrorEnabled(marker?.toSlf4j())
Level.OFF -> false
}
}
}

0 comments on commit ac65cc9

Please sign in to comment.