logx

package
v1.0.2 Latest Latest
Warning

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

Go to latest
Published: Dec 31, 2025 License: Apache-2.0 Imports: 12 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.

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