Use Velo as a high-performance backend for Go’s standard log/slog package
Velo implements Go’s slog.Handler interface, allowing you to use Velo as a drop-in replacement for the standard library’s structured logging while maintaining compatibility with existing slog-based code.
Replace the global slog logger to make all slog calls use Velo:
veloLogger := velo.NewWithOptions(os.Stderr, velo.Options{ ReportTimestamp: true, Async: true,})defer veloLogger.Close()handler := velo.NewSlogHandler(veloLogger)slog.SetDefault(slog.New(handler))// Now all slog package-level calls use Veloslog.Info("using velo backend")slog.Error("error occurred", "error", err)
Setting Velo as the default slog handler lets you gradually migrate existing slog-based code to benefit from Velo’s performance without rewriting everything at once.
Velo automatically maps slog levels to equivalent Velo levels:
slog Level
Velo Level
slog.LevelDebug
velo.DebugLevel
slog.LevelInfo
velo.InfoLevel
slog.LevelWarn
velo.WarnLevel
slog.LevelError
velo.ErrorLevel
logger.Debug("debug message") // Maps to velo.DebugLevellogger.Info("info message") // Maps to velo.InfoLevellogger.Warn("warning") // Maps to velo.WarnLevellogger.Error("error occurred") // Maps to velo.ErrorLevel
Errors are automatically detected and converted to Velo error fields:
err := errors.New("connection failed")logger.Error("database error", slog.Any("error", err), slog.String("operation", "query"),)// The error is converted to velo.Err(err)
For maximum performance in hot paths, use Velo’s native API. Reserve the slog handler for compatibility with existing code or third-party libraries that require slog.Logger.
You can use both slog and Velo APIs in the same application:
// Initialize with slog handlerveloLogger := velo.New(os.Stderr)defer veloLogger.Close()slogLogger := slog.New(velo.NewSlogHandler(veloLogger))// Use slog for compatibilityslogLogger.Info("using slog interface")// Use Velo directly for performanceveloLogger.InfoFields("using velo interface", velo.String("key", "value"),)