diff --git a/go.mod b/go.mod index f74a7dc2c6..fa1beaa46c 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/fsnotify/fsnotify v1.9.0 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/cors v1.2.2 - github.com/go-chi/httplog/v2 v2.1.1 + github.com/go-chi/httplog/v3 v3.3.0 github.com/go-chi/render v1.0.3 github.com/go-goquery/goquery v1.0.1 github.com/go-playground/validator/v10 v10.28.0 diff --git a/go.sum b/go.sum index c3f59c72d4..a85fa4b20d 100644 --- a/go.sum +++ b/go.sum @@ -900,8 +900,8 @@ github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-chi/cors v1.2.2 h1:Jmey33TE+b+rB7fT8MUy1u0I4L+NARQlK6LhzKPSyQE= github.com/go-chi/cors v1.2.2/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= -github.com/go-chi/httplog/v2 v2.1.1 h1:ojojiu4PIaoeJ/qAO4GWUxJqvYUTobeo7zmuHQJAxRk= -github.com/go-chi/httplog/v2 v2.1.1/go.mod h1:/XXdxicJsp4BA5fapgIC3VuTD+z0Z/VzukoB3VDc1YE= +github.com/go-chi/httplog/v3 v3.3.0 h1:Gr6Y7nSzbpyCyRwKPOVKjDH3BH6TH5uvRNDsTZWDpvU= +github.com/go-chi/httplog/v3 v3.3.0/go.mod h1:N/J1l5l1fozUrqIVuT8Z/HzNeSy8TF2EFyokPLe6y2w= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= diff --git a/internal/log/log.go b/internal/log/log.go index 710dc2ee95..5b719fb25a 100644 --- a/internal/log/log.go +++ b/internal/log/log.go @@ -59,22 +59,22 @@ func NewStdLogger(outW, errW io.Writer, logLevel string) (Logger, error) { } // DebugContext logs debug messages -func (sl *StdLogger) DebugContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StdLogger) DebugContext(ctx context.Context, msg string, keysAndValues ...any) { sl.outLogger.DebugContext(ctx, msg, keysAndValues...) } // InfoContext logs debug messages -func (sl *StdLogger) InfoContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StdLogger) InfoContext(ctx context.Context, msg string, keysAndValues ...any) { sl.outLogger.InfoContext(ctx, msg, keysAndValues...) } // WarnContext logs warning messages -func (sl *StdLogger) WarnContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StdLogger) WarnContext(ctx context.Context, msg string, keysAndValues ...any) { sl.errLogger.WarnContext(ctx, msg, keysAndValues...) } // ErrorContext logs error messages -func (sl *StdLogger) ErrorContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StdLogger) ErrorContext(ctx context.Context, msg string, keysAndValues ...any) { sl.errLogger.ErrorContext(ctx, msg, keysAndValues...) } @@ -177,21 +177,21 @@ func NewStructuredLogger(outW, errW io.Writer, logLevel string) (Logger, error) } // DebugContext logs debug messages -func (sl *StructuredLogger) DebugContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StructuredLogger) DebugContext(ctx context.Context, msg string, keysAndValues ...any) { sl.outLogger.DebugContext(ctx, msg, keysAndValues...) } // InfoContext logs info messages -func (sl *StructuredLogger) InfoContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StructuredLogger) InfoContext(ctx context.Context, msg string, keysAndValues ...any) { sl.outLogger.InfoContext(ctx, msg, keysAndValues...) } // WarnContext logs warning messages -func (sl *StructuredLogger) WarnContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StructuredLogger) WarnContext(ctx context.Context, msg string, keysAndValues ...any) { sl.errLogger.WarnContext(ctx, msg, keysAndValues...) } // ErrorContext logs error messages -func (sl *StructuredLogger) ErrorContext(ctx context.Context, msg string, keysAndValues ...interface{}) { +func (sl *StructuredLogger) ErrorContext(ctx context.Context, msg string, keysAndValues ...any) { sl.errLogger.ErrorContext(ctx, msg, keysAndValues...) } diff --git a/internal/log/logger.go b/internal/log/logger.go index 090bb61569..14da0bfdfb 100644 --- a/internal/log/logger.go +++ b/internal/log/logger.go @@ -21,11 +21,11 @@ import ( // Logger is the interface used throughout the project for logging. type Logger interface { // DebugContext is for reporting additional information about internal operations. - DebugContext(ctx context.Context, format string, args ...interface{}) + DebugContext(ctx context.Context, format string, args ...any) // InfoContext is for reporting informational messages. - InfoContext(ctx context.Context, format string, args ...interface{}) + InfoContext(ctx context.Context, format string, args ...any) // WarnContext is for reporting warning messages. - WarnContext(ctx context.Context, format string, args ...interface{}) + WarnContext(ctx context.Context, format string, args ...any) // ErrorContext is for reporting errors. - ErrorContext(ctx context.Context, format string, args ...interface{}) + ErrorContext(ctx context.Context, format string, args ...any) } diff --git a/internal/server/server.go b/internal/server/server.go index f77c504113..d126cf2ffa 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "log/slog" "net" "net/http" "slices" @@ -28,7 +29,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/go-chi/cors" - "github.com/go-chi/httplog/v2" + "github.com/go-chi/httplog/v3" "github.com/googleapis/genai-toolbox/internal/auth" "github.com/googleapis/genai-toolbox/internal/embeddingmodels" "github.com/googleapis/genai-toolbox/internal/log" @@ -347,31 +348,16 @@ func NewServer(ctx context.Context, cfg ServerConfig) (*Server, error) { if err != nil { return nil, fmt.Errorf("unable to initialize http log: %w", err) } - var httpOpts httplog.Options - switch cfg.LoggingFormat.String() { - case "json": - httpOpts = httplog.Options{ - JSON: true, - LogLevel: logLevel, - Concise: true, - RequestHeaders: false, - MessageFieldName: "message", - SourceFieldName: "logging.googleapis.com/sourceLocation", - TimeFieldName: "timestamp", - LevelFieldName: "severity", - } - case "standard": - httpOpts = httplog.Options{ - LogLevel: logLevel, - Concise: true, - RequestHeaders: false, - MessageFieldName: "message", - } - default: - return nil, fmt.Errorf("invalid Logging format: %q", cfg.LoggingFormat.String()) + + schema := httplog.SchemaGCP + schema.Level = cfg.LogLevel.String() + schema.Concise(true) + httpOpts := &httplog.Options{ + Level: logLevel, + Schema: schema, } - httpLogger := httplog.NewLogger("httplog", httpOpts) - r.Use(httplog.RequestLogger(httpLogger)) + logger := l.(*slog.Logger) + r.Use(httplog.RequestLogger(logger, httpOpts)) sourcesMap, authServicesMap, embeddingModelsMap, toolsMap, toolsetsMap, promptsMap, promptsetsMap, err := InitializeConfigs(ctx, cfg) if err != nil {