package
0.13.0
Repository: https://github.com/go-kit/kit.git
Documentation: pkg.go.dev

# README

package log

Deprecation notice: The core Go kit log packages (log, log/level, log/term, and log/syslog) have been moved to their own repository at github.com/go-kit/log. The corresponding packages in this directory remain for backwards compatibility. Their types alias the types and their functions call the functions provided by the new repository. Using either import path should be equivalent. Prefer the new import path when practical.


package log provides a minimal interface for structured logging in services. It may be wrapped to encode conventions, enforce type-safety, provide leveled logging, and so on. It can be used for both typical application log events, and log-structured data streams.

Structured logging

Structured logging is, basically, conceding to the reality that logs are data, and warrant some level of schematic rigor. Using a stricter, key/value-oriented message format for our logs, containing contextual and semantic information, makes it much easier to get insight into the operational activity of the systems we build. Consequently, package log is of the strong belief that "the benefits of structured logging outweigh the minimal effort involved".

Migrating from unstructured to structured logging is probably a lot easier than you'd expect.

// Unstructured
log.Printf("HTTP server listening on %s", addr)

// Structured
logger.Log("transport", "HTTP", "addr", addr, "msg", "listening")

Usage

Typical application logging

w := log.NewSyncWriter(os.Stderr)
logger := log.NewLogfmtLogger(w)
logger.Log("question", "what is the meaning of life?", "answer", 42)

// Output:
// question="what is the meaning of life?" answer=42

Contextual Loggers

func main() {
	var logger log.Logger
	logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
	logger = log.With(logger, "instance_id", 123)

	logger.Log("msg", "starting")
	NewWorker(log.With(logger, "component", "worker")).Run()
	NewSlacker(log.With(logger, "component", "slacker")).Run()
}

// Output:
// instance_id=123 msg=starting
// instance_id=123 component=worker msg=running
// instance_id=123 component=slacker msg=running

Interact with stdlib logger

Redirect stdlib logger to Go kit logger.

import (
	"os"
	stdlog "log"
	kitlog "github.com/go-kit/kit/log"
)

func main() {
	logger := kitlog.NewJSONLogger(kitlog.NewSyncWriter(os.Stdout))
	stdlog.SetOutput(kitlog.NewStdlibAdapter(logger))
	stdlog.Print("I sure like pie")
}

// Output:
// {"msg":"I sure like pie","ts":"2016/01/01 12:34:56"}

Or, if, for legacy reasons, you need to pipe all of your logging through the stdlib log package, you can redirect Go kit logger to the stdlib logger.

logger := kitlog.NewLogfmtLogger(kitlog.StdlibWriter{})
logger.Log("legacy", true, "msg", "at least it's something")

// Output:
// 2016/01/01 12:34:56 legacy=true msg="at least it's something"

Timestamps and callers

var logger log.Logger
logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller)

logger.Log("msg", "hello")

// Output:
// ts=2016-01-01T12:34:56Z caller=main.go:15 msg=hello

Levels

Log levels are supported via the level package.

Supported output formats

Enhancements

package log is centered on the one-method Logger interface.

type Logger interface {
	Log(keyvals ...interface{}) error
}

This interface, and its supporting code like is the product of much iteration and evaluation. For more details on the evolution of the Logger interface, see The Hunt for a Logger Interface, a talk by Chris Hines. Also, please see #63, #76, #131, #157, #164, and #252 to review historical conversations about package log and the Logger interface.

Value-add packages and suggestions, like improvements to the leveled logger, are of course welcome. Good proposals should

  • Be composable with contextual loggers,
  • Not break the behavior of log.Caller in any wrapped contextual loggers, and
  • Be friendly to packages that accept only an unadorned log.Logger.

Benchmarks & comparisons

There are a few Go logging benchmarks and comparisons that include Go kit's package log.

# Packages

Package levels implements leveled logging on top of Go kit's log package.
Package level implements leveled logging on top of Go kit's log package.
Package logrus provides an adapter to the go-kit log.Logger interface.
Deprecated: Use github.com/go-kit/log/syslog instead.
Package term provides tools for logging to a terminal.

# Functions

Caller returns a Valuer that returns a file and line from a specified depth in the callstack.
FileKey sets the key for the file and line field.
MessageKey sets the key for the actual log message.
NewJSONLogger returns a Logger that encodes keyvals to the Writer as a single JSON object.
NewLogfmtLogger returns a logger that encodes keyvals to the Writer in logfmt format.
NewNopLogger returns a logger that doesn't do anything.
NewStdlibAdapter returns a new StdlibAdapter wrapper around the passed logger.
NewSyncLogger returns a logger that synchronizes concurrent use of the wrapped logger.
NewSyncWriter returns a new writer that is safe for concurrent use by multiple goroutines.
Prefix configures the adapter to parse a prefix from stdlib log events.
Timestamp returns a timestamp Valuer.
TimestampFormat returns a timestamp Valuer with a custom time format.
TimestampKey sets the key for the timestamp field.
With returns a new contextual logger with keyvals prepended to those passed to calls to Log.
WithPrefix returns a new contextual logger with keyvals prepended to those passed to calls to Log.
WithSuffix returns a new contextual logger with keyvals appended to those passed to calls to Log.

# Variables

DefaultCaller is a Valuer that returns the file and line where the Log method was invoked.
DefaultTimestamp is a Valuer that returns the current wallclock time, respecting time zones, when bound.
DefaultTimestampUTC is a Valuer that returns the current time in UTC when bound.
ErrMissingValue is appended to keyvals slices with odd length to substitute the missing value.

# Type aliases

Logger is the fundamental interface for all log operations.
LoggerFunc is an adapter to allow use of ordinary functions as Loggers.
StdlibAdapter wraps a Logger and allows it to be passed to the stdlib logger's SetOutput.
StdlibAdapterOption sets a parameter for the StdlibAdapter.
StdlibWriter implements io.Writer by invoking the stdlib log.Print.
SwapLogger wraps another logger that may be safely replaced while other goroutines use the SwapLogger concurrently.
A Valuer generates a log value.