Logging Integrations¶
AEDevLens works with any logging library. Just forward logs to AEDevLens.default.log().
Kermit¶
import co.touchlab.kermit.LogWriter
import co.touchlab.kermit.Severity
import com.ae.devlens.AEDevLens
import com.ae.devlens.plugins.logs.model.LogSeverity
class DevLensKermitWriter(
private val inspector: AEDevLens = AEDevLens.default
) : LogWriter() {
override fun log(
severity: Severity,
message: String,
tag: String,
throwable: Throwable?
) {
inspector.log(
severity = severity.toDevLensLogSeverity(),
tag = tag,
message = buildString {
append(message)
throwable?.let { append("\n${it.stackTraceToString()}") }
}
)
}
}
private fun Severity.toDevLensLogSeverity(): LogSeverity = when (this) {
Severity.Verbose -> LogSeverity.VERBOSE
Severity.Debug -> LogSeverity.DEBUG
Severity.Info -> LogSeverity.INFO
Severity.Warn -> LogSeverity.WARN
Severity.Error -> LogSeverity.ERROR
Severity.Assert -> LogSeverity.ASSERT
}
// Setup
Logger.addLogWriter(DevLensKermitWriter())
Napier¶
import io.github.aakira.napier.Antilog
import io.github.aakira.napier.LogLevel
import com.ae.devlens.AEDevLens
import com.ae.devlens.plugins.logs.model.LogSeverity
class DevLensNapierAntilog(
private val inspector: AEDevLens = AEDevLens.default
) : Antilog() {
override fun performLog(
priority: LogLevel,
tag: String?,
throwable: Throwable?,
message: String?
) {
inspector.log(
severity = priority.toDevLensLogSeverity(),
tag = tag ?: "Napier",
message = buildString {
message?.let { append(it) }
throwable?.let { append("\n${it.stackTraceToString()}") }
}
)
}
}
private fun LogLevel.toDevLensLogSeverity(): LogSeverity = when (this) {
LogLevel.VERBOSE -> LogSeverity.VERBOSE
LogLevel.DEBUG -> LogSeverity.DEBUG
LogLevel.INFO -> LogSeverity.INFO
LogLevel.WARNING -> LogSeverity.WARN
LogLevel.ERROR -> LogSeverity.ERROR
LogLevel.ASSERT -> LogSeverity.ASSERT
}
// Setup
Napier.base(DevLensNapierAntilog())
Timber (Android)¶
import timber.log.Timber
import com.ae.devlens.AEDevLens
import com.ae.devlens.plugins.logs.model.LogSeverity
class DevLensTimberTree(
private val inspector: AEDevLens = AEDevLens.default
) : Timber.Tree() {
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
inspector.log(
severity = priority.toDevLensLogSeverity(),
tag = tag ?: "Timber",
message = buildString {
append(message)
t?.let { append("\n${it.stackTraceToString()}") }
}
)
}
}
private fun Int.toDevLensLogSeverity(): LogSeverity = when (this) {
android.util.Log.VERBOSE -> LogSeverity.VERBOSE
android.util.Log.DEBUG -> LogSeverity.DEBUG
android.util.Log.INFO -> LogSeverity.INFO
android.util.Log.WARN -> LogSeverity.WARN
android.util.Log.ERROR -> LogSeverity.ERROR
android.util.Log.ASSERT -> LogSeverity.ASSERT
else -> LogSeverity.DEBUG
}
// Setup
Timber.plant(DevLensTimberTree())
KotlinLogging / SLF4J¶
import org.slf4j.event.Level
import com.ae.devlens.AEDevLens
import com.ae.devlens.plugins.logs.model.LogSeverity
import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.AppenderBase
class DevLensSlf4jAppender(
private val inspector: AEDevLens = AEDevLens.default
) : AppenderBase<ILoggingEvent>() {
override fun append(event: ILoggingEvent) {
inspector.log(
severity = event.level.toDevLensLogSeverity(),
tag = event.loggerName.substringAfterLast('.'),
message = event.formattedMessage
)
}
}
private fun Level.toDevLensLogSeverity(): LogSeverity = when (this) {
Level.TRACE -> LogSeverity.VERBOSE
Level.DEBUG -> LogSeverity.DEBUG
Level.INFO -> LogSeverity.INFO
Level.WARN -> LogSeverity.WARN
Level.ERROR -> LogSeverity.ERROR
}
Ktor Client Logging¶
import io.ktor.client.*
import io.ktor.client.plugins.logging.*
import com.ae.devlens.AEDevLens
import com.ae.devlens.plugins.logs.model.LogSeverity
val client = HttpClient {
install(Logging) {
logger = object : Logger {
override fun log(message: String) {
AEDevLens.default.log(
severity = LogSeverity.DEBUG,
tag = "HTTP",
message = message
)
}
}
level = LogLevel.ALL
}
}