hermannm.dev

devlog

Implemented in:

devlog is the name of a set of logging libraries that I've built for different programming languages. They all focus on developer-friendly structured logging, but they differ in their scope:

The Go implementation was the first version of devlog. After working with Go in multiple projects (casus-belli, analysis, coffeetalk, Ignite), one of the things I missed was a nicer human-readable log output format. So when Go added structured logging to its standard library, I took the opportunity to write my own log handler! With help from an amazing guide written by one of the Go maintainers, I built a structured log handler with an output format designed for readability in local development. I now use this in all my Go projects where I need logging.

Later, I started writing some Rust (see gadd), and there too I found myself missing nicer log output formats. So I decided to write my own log subscriber for tracing, one of the most popular logging libraries for Rust, to use the same output format as my Go library. And so, devlog-tracing was born.

Finally, after starting my job at Liflig, I started writing Kotlin for the backend. I found myself unhappy with the logging library we were using at the time, and so I decided to write yet another version of devlog. My aim with the library is to provide an ergonomic logging API that makes it as easy as possible to attach structured data to logs, while keeping the abstractions near-zero-cost at runtime. The implementation wraps the standard Java logging libraries SLF4J and Logback, so that it can interoperate with logs from other libraries. We now use this library in many of our backend services at Liflig, and I'm quite happy with it! It's quite satisfying to make a library that directly addresses frustrations you've been having.