logx

package
v0.10.13 Latest Latest
Warning

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

Go to latest
Published: May 2, 2025 License: Apache-2.0 Imports: 10 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()
    e.Logger = logx.New(os.Stdout)
}
Using existing zerolog instance
package main

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

func main() {
    log := zerolog.New(os.Stdout)
    e := echo.New()
    e.Logger = logx.From(log)
}

Options


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

func main() {
    e := echo.New()
    e.Logger = logx.New(
       os.Stdout,
       logx.WithLevel(log.DEBUG),
       logx.WithFields(map[string]interface{}{ "name": "hot diggity dogs"}),
       logx.WithTimestamp(),
       logx.WithCaller(),
       logx.WithPrefix("❤️ MITB"),
       logx.WithHook(...),
       logx.WithHookFunc(...),
    )
}

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()
    logger := logx.New(
            os.Stdout,
            logx.WithLevel(log.DEBUG),
            logx.WithTimestamp(),
            logx.WithCaller(),
         )
    e.Logger = logger

    e.Use(middleware.RequestID())
    e.Use(logx.Middleware(logx.Config{
    	Logger: logger
    }))
    e.GET("/", func(c echo.Context) error {
        c.Logger().Print("echos interface")
        zerolog.Ctx(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

logx.New(zerolog.MultiLevelWriter(consoleWriter, os.Stdout))

logx.From(zerolog.New(zerolog.MultiLevelWriter(consoleWriter, os.Stdout)))

logx.Middleware(logx.Config{ Logger: logx.New(zerolog.MultiLevelWriter(consoleWriter, os.Stdout)), })

Writing to a file with Lumberjack

logx.New(&lumberjack.Logger{ Filename: "/var/log/myapp/foo.log", MaxSize: 500, // megabytes MaxBackups: 3, MaxAge: 28, //days Compress: true, // disabled by default })

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

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
}

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 WithCallerWithSkipFrameCount

func WithCallerWithSkipFrameCount(skipFrameCount int) ConfigSetter

WithCallerWithSkipFrameCount sets the caller with a skip frame count on a Logger

func WithField

func WithField(name string, value any) ConfigSetter

WithField sets a field on a Logger

func WithFields

func WithFields(fields map[string]any) ConfigSetter

WithFields sets fields on a Logger

func WithHook

func WithHook(hook zerolog.Hook) ConfigSetter

WithHook sets the hook on a Logger

func WithHookFunc

func WithHookFunc(hook zerolog.HookFunc) ConfigSetter

WithHookFunc sets the hook function on a Logger

func WithLevel

func WithLevel(level log.Lvl) ConfigSetter

WithLevel sets the level on a Logger

func WithPrefix

func WithPrefix(prefix string) ConfigSetter

WithPrefix sets the prefix on a Logger

func WithTimestamp

func WithTimestamp() ConfigSetter

WithTimestamp sets the timestamp on a Logger

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

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 From

func From(log zerolog.Logger, setters ...ConfigSetter) *Logger

From returns a new Logger instance using existing zerolog log

func New

func New(out io.Writer, setters ...ConfigSetter) *Logger

New returns a new Logger instance

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)

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