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.
logFrontendpublic 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. |