Skip to content

Repository files navigation

log

LicenseGo ReferenceGitHubCIcodecov

Simple, fast, opinionated logging for command line applications 🪵

demo

Project Description

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 🚀

Installation

go get go.followtheprocess.codes/log@latest

Quickstart

package main
import (
"fmt""os""log/slog""go.followtheprocess.codes/log"
)
funcmain() {
logger:=log.New(os.Stderr)
logger.Debug("Debug me") // By default this one won't show up, default log level is INFOlogger.Info(
"Some information here",
// Yep! You use slog.Attrs for key value pairs, why reinvent the wheel?// ... says the guy who wrote a new Loggerslog.Bool("really", true),
)
logger.Warn("Uh oh!")
logger.Error("Goodbye")
}

Usage Guide

Make a new logger

logger:=log.New(os.Stderr)

Levels

log provides a levelled logger with the normal levels you'd expect:

log.LevelDebuglog.LevelInfolog.LevelWarnlog.LevelError

You write log lines at these levels with the corresponding methods on the Logger:

logger.Debug("...") // log.LevelDebuglogger.Info("...") // log.LevelInfologger.Warn("...") // log.LevelWarnlogger.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))

Key Value Pairs

log uses slog.Attr to provide "semi structured" logs. The message is free form text but you can attach arbitrary key, value pairs with any of the log methods

logger.Info(
"Doing something",
slog.Bool("cache", true),
slog.Duration("duration", 30*time.Second),
slog.Int("number", 42),
)

You can also create a "sub logger" with persistent key value pairs applied to every message

sub:=logger.With(slog.Bool("sub", true))
// They can have their own per-method keys too!sub.Info("Hello from the sub logger", slog.String("subkey", "yes"))

keys

Prefixes

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")

prefix

About

Simple, fast, opinionated logging for command line applications in Go

Topics

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages