@@ -14,6 +14,7 @@ import (
1414 "go.opentelemetry.io/otel/log/noop"
1515 sdklog "go.opentelemetry.io/otel/sdk/log"
1616 "go.uber.org/zap"
17+ "go.uber.org/zap/zapcore"
1718
1819 "github.com/go-faster/sdk/zctx"
1920)
@@ -58,8 +59,8 @@ type ShutdownFunc func(ctx context.Context) error
5859
5960// NewLoggerProvider initializes new [log.LoggerProvider] with the given options from environment variables.
6061func NewLoggerProvider (ctx context.Context , options ... Option ) (
61- meterProvider log.LoggerProvider ,
62- meterShutdown ShutdownFunc ,
62+ logProvider log.LoggerProvider ,
63+ logShutdown ShutdownFunc ,
6364 err error ,
6465) {
6566 cfg := newConfig (options )
@@ -68,11 +69,16 @@ func NewLoggerProvider(ctx context.Context, options ...Option) (
6869 if cfg .res != nil {
6970 logOptions = append (logOptions , sdklog .WithResource (cfg .res ))
7071 }
72+
7173 ret := func (e sdklog.Exporter ) (log.LoggerProvider , func (ctx context.Context ) error , error ) {
72- logOptions = append (logOptions , sdklog .WithProcessor (
73- sdklog .NewBatchProcessor (e ),
74- ))
75- return sdklog .NewLoggerProvider (logOptions ... ), e .Shutdown , nil
74+ logOptions = append (logOptions ,
75+ sdklog .WithProcessor (& levelFilterProcessor {
76+ next : sdklog .NewBatchProcessor (e ),
77+ severity : zapLevelToOTelSeverity (lg .Level ()),
78+ }),
79+ )
80+ provider := sdklog .NewLoggerProvider (logOptions ... )
81+ return provider , provider .Shutdown , nil
7682 }
7783 exporter := strings .TrimSpace (getEnvOr ("OTEL_LOGS_EXPORTER" , expOTLP ))
7884 switch exporter {
@@ -134,3 +140,57 @@ func NewLoggerProvider(ctx context.Context, options ...Option) (
134140 }
135141 return nil , nil , errors .Errorf ("unsupported OTEL_LOGS_EXPORTER %q" , exporter )
136142}
143+
144+ // levelFilterProcessor implements level filtering, since otlplog does not.
145+ //
146+ // Fuck you too, OpenTelemetry.
147+ type levelFilterProcessor struct {
148+ next sdklog.Processor
149+ severity log.Severity
150+ }
151+
152+ var (
153+ _ sdklog.FilterProcessor = (* levelFilterProcessor )(nil )
154+ _ sdklog.Processor = (* levelFilterProcessor )(nil )
155+ )
156+
157+ // Enabled implements [sdklog.FilterProcessor].
158+ func (l * levelFilterProcessor ) Enabled (ctx context.Context , param sdklog.EnabledParameters ) bool {
159+ return param .Severity >= l .severity
160+ }
161+
162+ // OnEmit implements [sdklog.Processor].
163+ func (l * levelFilterProcessor ) OnEmit (ctx context.Context , record * sdklog.Record ) error {
164+ return l .next .OnEmit (ctx , record )
165+ }
166+
167+ // ForceFlush implements [sdklog.Processor].
168+ func (l * levelFilterProcessor ) ForceFlush (ctx context.Context ) error {
169+ return l .next .ForceFlush (ctx )
170+ }
171+
172+ // Shutdown implements [sdklog.Processor].
173+ func (l * levelFilterProcessor ) Shutdown (ctx context.Context ) error {
174+ return l .next .Shutdown (ctx )
175+ }
176+
177+ func zapLevelToOTelSeverity (level zapcore.Level ) log.Severity {
178+ switch level {
179+ case zapcore .DebugLevel :
180+ return log .SeverityDebug
181+ case zapcore .InfoLevel :
182+ return log .SeverityInfo
183+ case zapcore .WarnLevel :
184+ return log .SeverityWarn
185+ case zapcore .ErrorLevel :
186+ return log .SeverityError
187+ case zapcore .DPanicLevel :
188+ return log .SeverityFatal1
189+ case zapcore .PanicLevel :
190+ return log .SeverityFatal2
191+ case zapcore .FatalLevel :
192+ return log .SeverityFatal3
193+ default :
194+ return log .SeverityUndefined
195+ }
196+ }
0 commit comments