Usage Recipes¶
Structured logging¶
Log exceptions with context¶
Split long messages¶
Use a filtered oak¶
class AnalyticsSink {
fun write(level: Lumber.Level, tag: String?, message: String, error: Throwable?) {
Analytics.track(level.name, tag, message, error)
}
}
class WarningsOnlyOak : Lumber.Oak() {
private val sink = AnalyticsSink()
override fun isLoggable(tag: String?, level: Lumber.Level) = level >= Lumber.Level.Warn
override fun log(level: Lumber.Level, tag: String?, message: String, error: Throwable?) {
sink.write(level, tag, message, error)
}
}
Plant more than one oak¶
class AnalyticsOak : Lumber.Oak() {
override fun isLoggable(tag: String?, level: Lumber.Level) = level >= Lumber.Level.Info
override fun log(level: Lumber.Level, tag: String?, message: String, error: Throwable?) {
Analytics.track(level.name, tag, message, error)
}
}
Lumber.plant(DebugOak(), AnalyticsOak())
Keep the public API small¶
Use internal for helpers that are implementation detail only.
That keeps the published contract focused on Lumber, Lumber.Oak, Lumber.Level, and DebugOak.