package main
import (
"context"
"time"
"github.com/drossan/go_logs"
"github.com/drossan/go_logs/async"
)
func main() {
// Create sync logger with JSON formatter for production
syncLogger, _ := go_logs.New(
go_logs.WithLevel(go_logs.InfoLevel),
go_logs.WithFormatter(go_logs.NewJSONFormatter()),
go_logs.WithRotatingFile("/var/log/app.log", 100, 5),
)
// Wrap with async capabilities
config := async.Config{
BufferSize: 5000,
ShutdownTimeout: 10 * time.Second,
}
logger := async.WrapWithConfig(syncLogger, config)
defer logger.Sync()
// Create child logger with request context
reqLogger := logger.With(
go_logs.String("request_id", "req-123"),
go_logs.String("user_id", "user-456"),
)
// Non-blocking logging
reqLogger.Info("Request started")
// Simulate processing
ctx := context.Background()
processRequest(ctx, reqLogger)
reqLogger.Info("Request completed")
// Metrics
if metrics := logger.GetMetrics(); metrics != nil {
snapshot := metrics.Snapshot()
reqLogger.Info("Logging metrics",
go_logs.Int64("total", snapshot.Total),
go_logs.Int64("dropped", metrics.Dropped()),
)
}
}
func processRequest(ctx context.Context, logger go_logs.Logger) {
// High-volume logging without blocking
for i := 0; i < 1000; i++ {
logger.Debug("Processing item",
go_logs.Int("item", i),
go_logs.String("status", "ok"),
)
}
}