Advanced
Working with custom frontends
Canard is a facade for multiplatform developers that need an easy way to log without worrying about platform specific implementation. For that we provide [default frontends] that are default output capacities, for each possible target of Kotlin/Multiplatform.
However, we can think of a lot of use cases that might not covered by default frontends, ike saving the logs into a file, sending the logs to an upstream system, etc.
If you want to use a custom implementation to handle your logs, you can create your own by using the interface LogFrontend
.
logFrontend
public fun interface LogFrontend {
public fun getReceiverFor(tag: Logger.Tag): LogReceiver (1)
}
1 | You only have to override getReceiverFor . |
The getReceiverFor
function will define what we should do of every logged entry. The rest depends on your use case. Here is an example of a frontend that will stack every log into a list:
custom frontend
class MemoryFrontend : LogFrontend { (1)
val entries: MutableList<Triple<Logger.Tag, Logger.Entry, String?>> = ArrayList() (2)
override fun getReceiverFor(tag: Logger.Tag): LogReceiver = (3)
LogReceiver { entry, message -> (4)
entries += Triple(tag, entry, message) (5)
}
}
1 | implement LogFrontend |
2 | create a mutable list that will carry the logs |
3 | override getReceiveFor |
4 | create a LogReceiver … |
5 | … that populate the entries with each log received |
We could use this example to periodically send our stack to an upstream server. |