Simple, fast, opinionated logging for command line applications 🪵
log
is a tiny and incredibly simple logging library designed to output nicely presented, human readable, levelled log messages. Ideal for command line applications ✨
There are many great logging libraries for Go out there, but so many of them are IMO too flexible and too complicated. I wanted a small, minimal dependency, opinionated logger I could use everywhere across all my Go projects (which are mostly command line applications). So I made one 🚀
go get go.followtheprocess.codes/log@latest
package main
import (
"fmt"
"os"
"go.followtheprocess.codes/log"
)
func main() {
logger := log.New(os.Stderr)
logger.Debug("Debug me") // By default this one won't show up, default log level is INFO
logger.Info("Some information here", "really", true)
logger.Warn("Uh oh!")
logger.Error("Goodbye")
}
Make a new logger
logger := log.New(os.Stderr)
log
provides a levelled logger with the normal levels you'd expect:
log.LevelDebug
log.LevelInfo
log.LevelWarn
log.LevelError
You write log lines at these levels with the corresponding methods on the Logger
:
logger.Debug("...") // log.LevelDebug
logger.Info("...") // log.LevelInfo
logger.Warn("...") // log.LevelWarn
logger.Error("...") // log.LevelError
And you can configure a Logger
to display logs at or higher than a particular level with the WithLevel
option...
logger := log.New(os.Stderr, log.WithLevel(log.LevelDebug))
log
provides "semi structured" logs in that the message is free form text but you can attach arbitrary key value pairs to any of the log methods
logger.Info("Doing something", "cache", true, "duration", 30 * time.Second, "number", 42)
You can also create a "sub logger" with persistent key value pairs applied to every message
sub := logger.With("sub", true)
sub.Info("Hello from the sub logger", "subkey", "yes") // They can have their own per-method keys too!
log
lets you apply a "prefix" to your logger, either as an option to log.New
or by creating a "sub logger" with that prefix!
logger := log.New(os.Stderr, log.Prefix("http"))
Or...
logger := log.New(os.Stderr)
prefixed := logger.Prefixed("http")