Zeus

Zeus is a very simple utility package for context-based logging. In its core, it provides syntactic sugar for associating a logger with context.Context objects and retrieving it from these contexts.

Zeus uses the “blazing-fast and structured” logging library zap under the hood. By not using zap directly, interfaces in your code become less dependent on the logging library as you do not need to pass the logger around explicitly. Rather, the logger is “silently” attached to context objects which are deeply rooted in the Go language.

Installation

go get github.com/borchero/zeus

Logging Quickstart

func main() {
    // Ensures that all logs are flushed prior to program exit
    defer zeus.Sync()

    ctx := context.Background()
    // You can obtain a global logger instance from *any* context object in your application!
    logger := zeus.Logger(ctx)
    logger.Debug("hello")
    // >>> prints "DEBUG   hello"

    // You can do structured logging by customizing the logger that is associated with a context.
    // For example, you can give it a name...
    ctx = zeus.WithName(ctx, "test")
    zeus.Logger(ctx).Info("world")
    // >>> prints "INFO    test    world"

    // ...or add some fields to the logger.
    ctx = zeus.WithFields(ctx, zap.String("name", "borchero"))
    zeus.Logger(ctx).Info("new world")
    // >>> prints "INFO    test    new world       {"name": "borchero"}"
}

Note that zeus.Logger always returns a *zap.Logger instance which allows Zeus to be equally powerful as zap.

Log Configuration

In the example above, you see that we can use a logger without explicitly creating one beforehand. This logger can be customized either from environment variables (recommended) or from code.

When using environment variables, you may set GO_LOG and GO_LOG_FORMAT. GO_LOG allows for debug, info, warn, error, and fatal (and their uppercase counterparts) while GO_LOG_FORMAT may be set to human or json. By default, Zeus uses the following configuration:

  • GO_LOG=info
  • GO_LOG_FORMAT=human

When you need utmost customization, you can create your own *zap.Logger and attach it to a context via zeus.WithLogger. Be aware that such a logger is only available for the context passed to zeus.WithLogger and the context’s descendents. zeus.Sync will not ensure that all logs managed by this logger are printed and you will need to call Sync on this logger yourself.

GitHub

View Github