logx

package
v1.9.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 16, 2026 License: Apache-2.0 Imports: 13 Imported by: 1

README

echolog

Zerolog wrapper for Echo web framework.

Installation

go get github.com/theopenlane/core/pkg/logx

Quick start

package main

import (
	"os"
	echo "github.com/theopenlane/echox"
	"github.com/theopenlane/echox/middleware"
	"github.com/theopenlane/core/pkg/logx"
)

func main() {
	e := echo.New()
	loggers := logx.Configure(logx.LoggerConfig{
		WithEcho: true,
	})
	e.Logger = loggers.Echo
}
Using existing zerolog instance
package main

func main() {
	e := echo.New()
	loggers := logx.Configure(logx.LoggerConfig{
		Writer:        os.Stdout,
		Level:         zerolog.DebugLevel,
		Pretty:        true,
		IncludeCaller: true,
		Hooks: []zerolog.HookFunc{
			func(e *zerolog.Event, level zerolog.Level, msg string) {
				e.Str("component", "api")
			},
		},
		WithEcho: true,
	})
	e.Logger = loggers.Echo
}

Middleware

Logging requests and attaching request id to a context logger

import (
	"os",
	echo "github.com/theopenlane/echox"
	"github.com/theopenlane/echox/middleware"
	"github.com/theopenlane/core/pkg/logx"
	"github.com/rs/zerolog"
)

func main() {
	e := echo.New()
loggers := logx.Configure(logx.LoggerConfig{
		Writer:        os.Stdout,
		Level:         zerolog.DebugLevel,
		IncludeCaller: true,
		WithEcho:      true,
	})
	logger := loggers.Echo
	e.Logger = logger

	e.Use(middleware.RequestID())
	e.Use(logx.LoggingMiddleware(logx.Config{
		Logger: logger,
	}))
	e.GET("/", func(c echo.Context) error {
		c.Logger().Print("echos interface")
		logx.FromContext(c.Request().Context()).Print("zerlogs interface")

		return c.String(http.StatusOK, "MITB babbyyyyy")
	})
}

Escalate log level for slow requests:
e.Use(logx.Middleware(logx.Config{
    Logger: logger,
    RequestLatencyLevel: zerolog.WarnLevel,
    RequestLatencyLimit: 500 * time.Millisecond,
}))
Nesting under a sub dictionary
e.Use(logx.Middleware(logx.Config{
        Logger: logger,
        NestKey: "request"
    }))
    // Output: {"level":"info","request":{"remote_ip":"5.6.7.8","method":"GET", ...}, ...}
Enricher

Enricher allows you to add additional fields to the log entry.

e.Use(logx.Middleware(logx.Config{
        Logger: logger,
        Enricher: func(c echo.Context, logger zerolog.Context) zerolog.Context {
            return e.Str("user_id", c.Get("user_id"))
        },
    }))
    // Output: {"level":"info","user_id":"123", ...}
Enricher: func(c echo.Context, logger zerolog.Context) zerolog.Context {
  userId := c.Get("UserID")
  if userId != nil {
    return logger.Str("user_id", userId.(string))
  }
  return logger.Str("user_id", "")
}
Errors

The middleware does not automatically propagate errors up the chain. If you want to do that, you can set HandleError to true.

e.Use(logx.Middleware(logx.Config{
    Logger: logger,
    HandleError: true,
}))

Helpers

Level converters

import (
    "fmt"
    echo "github.com/theopenlane/echox"
    "github.com/theopenlane/echox/middleware"
    "github.com/labstack/gommon/log"
    "github.com/theopenlane/core/pkg/logx"
)

func main() {
	var z zerolog.Level
	var e log.Lvl

    z, e = logx.MatchEchoLevel(log.WARN)

    fmt.Println(z, e)

    e, z = logx.MatchZeroLevel(zerolog.INFO)

    fmt.Println(z, e)
}

Multiple Log output

writer := zerolog.MultiLevelWriter(consoleWriter, os.Stdout)
loggers := logx.Configure(logx.LoggerConfig{
	Writer:   writer,
	WithEcho: true,
})
middleware := logx.LoggingMiddleware(logx.Config{
	Logger: loggers.Echo,
})
Writing to a file with Lumberjack
fileLogger := &lumberjack.Logger{
	Filename:   "/var/log/myapp/foo.log",
	MaxSize:    500, // megabytes
	MaxBackups: 3,
	MaxAge:     28, // days
	Compress:   true,
}

loggers := logx.Configure(logx.LoggerConfig{
	Writer:   fileLogger,
	WithEcho: true,
})

Documentation

Overview

Package logx is a package for logging with echo and

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Ctx

func Ctx(ctx context.Context) *zerolog.Logger

Ctx returns a logger from the provided context; if no logger is found in the context, a new one is created

func FromContext added in v0.43.0

func FromContext(ctx context.Context) *zerolog.Logger

FromContext returns the logger stored on the context or falls back to the global logger.

func LoggingMiddleware

func LoggingMiddleware(config Config) echo.MiddlewareFunc

LoggingMiddleware is a middleware that logs requests using the provided logger

func MatchEchoLevel

func MatchEchoLevel(level log.Lvl) (zerolog.Level, log.Lvl)

MatchEchoLevel returns a zerolog level and echo level for a given echo level

func MatchZeroLevel

func MatchZeroLevel(level zerolog.Level) (log.Lvl, zerolog.Level)

MatchZeroLevel returns an echo level and zerolog level for a given zerolog level

func SeedContext added in v0.43.0

func SeedContext(ctx context.Context) context.Context

SeedContext ensures the provided context carries a logger, returning a derived context when necessary.

func WithField

func WithField(ctx context.Context, key string, value any) context.Context

WithField adds a single field to both the logger and the durable field store on the context.

func WithFields

func WithFields(ctx context.Context, fields map[string]any) context.Context

WithFields adds multiple fields to both the logger and the durable field store on the context.

Types

type Config

type Config struct {
	// Logger is a custom instance of the logger to use
	Logger *Logger
	// Skipper defines a function to skip middleware
	Skipper middleware.Skipper
	// AfterNextSkipper defines a function to skip middleware after the next handler is called
	AfterNextSkipper middleware.Skipper
	// BeforeNext is a function that is executed before the next handler is called
	BeforeNext middleware.BeforeFunc
	// Enricher is a function that can be used to enrich the logger with additional information
	Enricher Enricher
	// RequestIDHeader is the header name to use for the request ID in a log record
	RequestIDHeader string
	// RequestIDKey is the key name to use for the request ID in a log record
	RequestIDKey string
	// NestKey is the key name to use for the nested logger in a log record
	NestKey string
	// HandleError indicates whether to propagate errors up the middleware chain, so the global error handler can decide appropriate status code
	HandleError bool
	// For long-running requests that take longer than this limit, log at a different level
	RequestLatencyLimit time.Duration
	// The level to log at if RequestLatencyLimit is exceeded
	RequestLatencyLevel zerolog.Level
	// AttachRequestMetadata controls whether stable request metadata (client origin IP, user agent, and forwarding headers)
	// is attached to the request-scoped logger context so downstream log entries can include it.
	AttachRequestMetadata bool
}

Config defines the config for the echolog middleware

type ConfigSetter

type ConfigSetter func(opts *Options)

ConfigSetter is a function that sets an option on a Logger

func WithCaller

func WithCaller() ConfigSetter

WithCaller sets the caller on a Logger

func WithLevel

func WithLevel(level log.Lvl) ConfigSetter

WithLevel sets the level on a Logger

func WithSeverityMapping added in v0.43.0

func WithSeverityMapping() ConfigSetter

WithSeverityMapping ensures each log event has a severity field aligned with GCP expectations

func WithTimestamp

func WithTimestamp() ConfigSetter

WithTimestamp sets the timestamp on a Logger

func WithZeroLevel added in v0.43.0

func WithZeroLevel(level zerolog.Level) ConfigSetter

WithZeroLevel sets the zerolog level on a Logger while keeping the echo level in sync

type Context

type Context struct {
	echo.Context
	// contains filtered or unexported fields
}

Context is a wrapper around echo.Context that provides a logger

func NewContext

func NewContext(ctx echo.Context, logger *Logger) *Context

NewContext returns a new Context

func (*Context) Logger

func (c *Context) Logger() echo.Logger

Logger returns the logger from the context

type Enricher

type Enricher func(c echo.Context, logger zerolog.Context) zerolog.Context

Enricher is a function that can be used to enrich the logger with additional information

type LogFields added in v1.9.6

type LogFields map[string]any

LogFields holds structured log fields that can be captured and restored.

func FieldsFromContext added in v1.9.6

func FieldsFromContext(ctx context.Context) LogFields

FieldsFromContext returns the durable log fields stored on the context.

type Logger

type Logger struct {
	// contains filtered or unexported fields
}

Logger is a wrapper around zerolog.Logger that provides an implementation of the echo.Logger interface

func (*Logger) Debug

func (l *Logger) Debug(i ...any)

Debug implements echo.Logger interface

func (*Logger) Debugf

func (l *Logger) Debugf(format string, i ...any)

Debugf implements echo.Logger interface

func (*Logger) Debugj

func (l *Logger) Debugj(j log.JSON)

Debugj implements echo.Logger interface

func (*Logger) Error

func (l *Logger) Error(err error)

Error implements echo.Logger interface

func (*Logger) Errorf

func (l *Logger) Errorf(format string, i ...any)

Errorf implements echo.Logger interface

func (*Logger) Errorj

func (l *Logger) Errorj(j log.JSON)

Errorj implements echo.Logger interface

func (*Logger) Fatal

func (l *Logger) Fatal(i ...any)

Fatal implements echo.Logger interface

func (*Logger) Fatalf

func (l *Logger) Fatalf(format string, i ...any)

Fatalf implements echo.Logger interface

func (*Logger) Fatalj

func (l *Logger) Fatalj(j log.JSON)

Fatalj implements echo.Logger interface

func (*Logger) Info

func (l *Logger) Info(i ...any)

Info implements echo.Logger interface

func (*Logger) Infof

func (l *Logger) Infof(format string, i ...any)

Infof implements echo.Logger interface

func (*Logger) Infoj

func (l *Logger) Infoj(j log.JSON)

Infoj implements echo.Logger interface

func (*Logger) Level

func (l *Logger) Level() log.Lvl

Level implements echo.Logger interface

func (*Logger) Output

func (l *Logger) Output() io.Writer

Output implements echo.Logger interface

func (*Logger) Panic

func (l *Logger) Panic(i ...any)

Panic implements echo.Logger interface

func (*Logger) Panicf

func (l *Logger) Panicf(format string, i ...any)

Panicf implements echo.Logger interface

func (*Logger) Panicj

func (l *Logger) Panicj(j log.JSON)

Panicj implements echo.Logger interface

func (*Logger) Prefix

func (l *Logger) Prefix() string

Prefix implements echo.Logger interface

func (*Logger) Print

func (l *Logger) Print(i ...any)

Print implements echo.Logger interface

func (*Logger) Printf

func (l *Logger) Printf(format string, i ...any)

Printf implements echo.Logger interface

func (*Logger) Printj

func (l *Logger) Printj(j log.JSON)

Printj implements echo.Logger interface

func (*Logger) SetHeader

func (l *Logger) SetHeader(_ string)

SetHeader implements echo.Logger interface

func (*Logger) SetLevel

func (l *Logger) SetLevel(level log.Lvl)

SetLevel implements echo.Logger interface

func (*Logger) SetOutput

func (l *Logger) SetOutput(newOut io.Writer)

SetOutput implements echo.Logger interface

func (*Logger) SetPrefix

func (l *Logger) SetPrefix(newPrefix string)

SetPrefix implements echo.Logger interface

func (*Logger) Unwrap

func (l *Logger) Unwrap() zerolog.Logger

Unwrap returns the underlying zerolog.Logger

func (*Logger) Warn

func (l *Logger) Warn(i ...any)

Warn implements echo.Logger interface

func (*Logger) Warnf

func (l *Logger) Warnf(format string, i ...any)

Warnf implements echo.Logger interface

func (*Logger) Warnj

func (l *Logger) Warnj(j log.JSON)

Warnj implements echo.Logger interface

func (Logger) WithContext

func (l Logger) WithContext(ctx context.Context) context.Context

WithContext returns a new context with the provided logger

func (*Logger) Write

func (l *Logger) Write(p []byte) (n int, err error)

Write implements the io.Writer interface for Logger

type LoggerConfig added in v0.43.0

type LoggerConfig struct {
	// Level sets the zerolog level. Use zerolog.NoLevel to keep the existing global default.
	Level zerolog.Level
	// Pretty toggles human-readable console output instead of structured JSON.
	Pretty bool
	// Writer controls where logs are written. Defaults to os.Stdout.
	Writer io.Writer
	// IncludeCaller attaches caller information to each log entry.
	IncludeCaller bool
	// Hooks are applied to every log event.
	Hooks []zerolog.HookFunc
	// WithEcho instructs Configure to build an echo-compatible logger.
	WithEcho bool
	// SetGlobal updates zerolog's global logger (`log.Logger`) using the configured settings.
	SetGlobal bool
}

LoggerConfig controls how loggers produced by Configure behave.

type LoggerSet added in v0.43.0

type LoggerSet struct {
	Logger zerolog.Logger
	Echo   *Logger
}

Result contains the loggers produced by Configure.

func Configure added in v0.43.0

func Configure(cfg LoggerConfig) LoggerSet

Configure builds loggers according to the supplied configuration.

type Options

type Options struct {
	// contains filtered or unexported fields
}

Options is a struct that holds the options for a Logger

Directories

Path Synopsis
Package console log is a zerolog consolewriter output formatter that can be used generically with any zerolog instantiation so that it's not specific to a particular application
Package console log is a zerolog consolewriter output formatter that can be used generically with any zerolog instantiation so that it's not specific to a particular application

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL