package main
import (
"context"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/drossan/go_logs"
"github.com/drossan/go_logs/otel"
)
func main() {
// Configure OTLP exporter
otlpConfig := otel.OTLPConfig{
Endpoint: os.Getenv("OTLP_ENDPOINT"),
MaxPending: 500,
FlushInterval: 10 * time.Second,
Timeout: 30 * time.Second,
Headers: map[string]string{
"Authorization": "Bearer " + os.Getenv("OTLP_TOKEN"),
},
}
exporter := otel.NewOTLPExporterWithConfig(otlpConfig)
defer exporter.Close()
// Create OTLP hook (INFO and above)
otlpHook := otel.NewOTLPHookWithExporter(exporter, go_logs.InfoLevel)
defer otlpHook.Close()
// Create logger with multiple outputs
logger, _ := go_logs.New(
go_logs.WithLevel(go_logs.DebugLevel),
go_logs.WithFormatter(go_logs.NewJSONFormatter()),
go_logs.WithRotatingFile("/var/log/app.log", 100, 5),
go_logs.WithHook(otlpHook), // Send to OTLP
)
logger.Info("Application started",
go_logs.String("version", "1.0.0"),
go_logs.String("environment", os.Getenv("ENV")),
)
// HTTP server
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
reqLogger := logger.With(
go_logs.String("request_id", generateRequestID()),
go_logs.String("method", r.Method),
go_logs.String("path", r.URL.Path),
)
reqLogger.Info("Request received")
// Business logic...
reqLogger.Info("Request completed",
go_logs.Int("status", http.StatusOK),
go_logs.Int64("duration_ms", 42),
)
w.WriteHeader(http.StatusOK)
})
// Start server
srv := &http.Server{Addr: ":8080"}
go func() {
logger.Info("Server listening", go_logs.Int("port", 8080))
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.Fatal("Server failed", go_logs.Err(err))
}
}()
// Graceful shutdown
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
<-sigChan
logger.Info("Shutting down gracefully")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
logger.Error("Shutdown error", go_logs.Err(err))
}
// Flush remaining logs
logger.Sync()
logger.Info("Shutdown complete")
}
func generateRequestID() string {
return fmt.Sprintf("req-%d", time.Now().UnixNano())
}