errlog is a error logging package based on log/slog standard library.
It provides error logging with stack trace and source location.
It does not require any third-party package.
go get github.com/ichizero/errlogerrlog.NewHandler wraps slog.Handler, so you can provide *slog.JSONHandler, *slog.TextHandler,
or any other handler.
h := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{AddSource: true})
hErr := errlog.NewHandler(h, &errlog.HandlerOptions{OverrideSource: true, SuppressStackTrace: false})
slog.SetDefault(slog.New(hErr))errlog.Err wraps error with stack trace and returns slog.Attr with key error.
err := errors.New("test error")
slog.ErrorContext(ctx, "test", errlog.Err(err))errlog.NewHandler outputs stack trace with the error that implements errlog.StackTrace interface,
so you can provide custom error with stack trace.
type yourCustomError struct {
err error
stack []uintptr
}
func (e yourCustomError) Stack() []uintptr {
return e.stack
}If so, you can log stack trace without using errlog.Err.
err := newYourCustomError("error")
slog.ErrorContext(ctx, "test", slog.Any("error", err))package main
import (
"context"
"errors"
"log/slog"
"os"
"github.com/ichizero/errlog"
)
func main() {
h := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{AddSource: true})
hErr := errlog.NewHandler(h, &errlog.HandlerOptions{OverrideSource: true, SuppressStackTrace: false})
slog.SetDefault(slog.New(hErr))
ctx := context.Background()
err := errors.New("test error")
slog.ErrorContext(ctx, "test", errlog.Err(err))
err = errlog.WrapError(err)
slog.ErrorContext(ctx, "test", slog.Any("error", err))
}