@@ -4,14 +4,11 @@ import (
44 "context"
55 "errors"
66 "fmt"
7- "runtime"
87
98 "github.com/aws/smithy-go/logging"
109 "github.com/sierrasoftworks/humane-errors-go"
11- "go.opentelemetry.io/otel/codes"
1210 "go.opentelemetry.io/otel/log"
1311 "go.opentelemetry.io/otel/log/global"
14- "go.opentelemetry.io/otel/trace"
1512 "go.uber.org/zap"
1613 "go.uber.org/zap/zapcore"
1714)
@@ -95,42 +92,28 @@ func (l *Logger) WithOptions(opts ...zap.Option) *Logger {
9592// humane.New("foo", "bar")
9693// )
9794func (l * Logger ) WithError (err error ) * Logger {
98- var e humane.Error
99- if ok := errors .As (err , & e ); ! ok {
100- return l
101- }
95+ zapFields := make ([]zap.Field , 0 )
96+ zapFields = append (zapFields , zap .Error (err ))
10297
103- ctx := struct {
104- Advice []string
105- Causes []error
106- }{
107- Advice : e .Advice (),
108- Causes : []error {},
109- }
98+ advice := make ([]string , 0 )
99+ causes := make ([]error , 0 )
100+ for err != nil {
101+ var herr humane.Error
102+ if ok := errors .As (err , & herr ); ok {
103+ causes = append (causes , err )
104+ advice = append (advice , herr .Advice ()... )
105+ }
110106
111- var cause error
112- if e , ok := err .(interface {
113- Cause () error
114- }); ok {
115- cause = e .Cause ()
107+ err = errors .Unwrap (err )
116108 }
117109
118- for cause != nil {
119- ctx .Causes = append (ctx .Causes , cause )
120-
121- if cause , ok := e .Cause ().(interface {
122- Advice () []string
123- }); ok {
124- ctx .Advice = append (cause .Advice (), ctx .Advice ... )
125- }
126-
127- cause = errors .Unwrap (cause )
110+ if len (advice ) > 0 {
111+ zapFields = append (zapFields , zap .Strings ("error_advice" , advice ))
128112 }
129113
130- zapFields := make ([]zap.Field , 0 )
131- zapFields = append (zapFields , zap .Errors ("causes" , ctx .Causes ))
132- zapFields = append (zapFields , zap .Strings ("advice" , ctx .Advice ))
133- zapFields = append (zapFields , zap .Error (err ))
114+ if len (causes ) > 1 {
115+ zapFields = append (zapFields , zap .Errors ("error_causes" , causes [1 :]))
116+ }
134117
135118 return l .With (zapFields ... )
136119}
@@ -169,41 +152,106 @@ func (l *Logger) Ctx(ctx context.Context) LoggerWithCtx {
169152 }
170153}
171154
172- func (l * Logger ) DebugContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
173- fields = l .logFields (ctx , zap .DebugLevel , msg , fields )
155+ // Log logs a message at the specified level. The message includes any fields
156+ // passed at the log site, as well as any fields accumulated on the logger.
157+ // Any Fields that require evaluation (such as Objects) are evaluated upon
158+ // invocation of Log.
159+ func (l * Logger ) Log (lvl zapcore.Level , msg string , fields ... zapcore.Field ) {
160+ fields = l .logFields (fields )
161+ l .skipCaller .Log (lvl , msg , fields ... )
162+ }
163+
164+ // Debug logs a message at DebugLevel. The message includes any fields passed
165+ // at the log site, as well as any fields accumulated on the logger.
166+ func (l * Logger ) Debug (msg string , fields ... zapcore.Field ) {
167+ fields = l .logFields (fields )
174168 l .skipCaller .Debug (msg , fields ... )
175169}
176170
177- func (l * Logger ) InfoContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
178- fields = l .logFields (ctx , zap .InfoLevel , msg , fields )
171+ // Info logs a message at InfoLevel. The message includes any fields passed
172+ // at the log site, as well as any fields accumulated on the logger.
173+ func (l * Logger ) Info (msg string , fields ... zapcore.Field ) {
174+ fields = l .logFields (fields )
179175 l .skipCaller .Info (msg , fields ... )
180176}
181177
182- func (l * Logger ) WarnContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
183- fields = l .logFields (ctx , zap .WarnLevel , msg , fields )
178+ // Warn logs a message at WarnLevel. The message includes any fields passed
179+ // at the log site, as well as any fields accumulated on the logger.
180+ func (l * Logger ) Warn (msg string , fields ... zapcore.Field ) {
181+ fields = l .logFields (fields )
184182 l .skipCaller .Warn (msg , fields ... )
185183}
186184
187- func (l * Logger ) ErrorContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
188- fields = l .logFields (ctx , zap .ErrorLevel , msg , fields )
185+ // Error logs a message at ErrorLevel. The message includes any fields passed
186+ // at the log site, as well as any fields accumulated on the logger.
187+ func (l * Logger ) Error (msg string , fields ... zapcore.Field ) {
188+ fields = l .logFields (fields )
189189 l .skipCaller .Error (msg , fields ... )
190190}
191191
192- func (l * Logger ) DPanicContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
193- fields = l .logFields (ctx , zap .DPanicLevel , msg , fields )
192+ // DPanic logs a message at DPanicLevel. The message includes any fields
193+ // passed at the log site, as well as any fields accumulated on the logger.
194+ //
195+ // If the logger is in development mode, it then panics (DPanic means
196+ // "development panic"). This is useful for catching errors that are
197+ // recoverable, but shouldn't ever happen.
198+ func (l * Logger ) DPanic (msg string , fields ... zapcore.Field ) {
199+ fields = l .logFields (fields )
194200 l .skipCaller .DPanic (msg , fields ... )
195201}
196202
197- func (l * Logger ) PanicContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
198- fields = l .logFields (ctx , zap .PanicLevel , msg , fields )
203+ // Panic logs a message at PanicLevel. The message includes any fields passed
204+ // at the log site, as well as any fields accumulated on the logger.
205+ //
206+ // The logger then panics, even if logging at PanicLevel is disabled.
207+ func (l * Logger ) Panic (msg string , fields ... zapcore.Field ) {
208+ fields = l .logFields (fields )
199209 l .skipCaller .Panic (msg , fields ... )
200210}
201211
202- func (l * Logger ) FatalContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
203- fields = l .logFields (ctx , zap .FatalLevel , msg , fields )
212+ // Fatal logs a message at FatalLevel. The message includes any fields passed
213+ // at the log site, as well as any fields accumulated on the logger.
214+ //
215+ // The logger then calls os.Exit(1), even if logging at FatalLevel is
216+ // disabled.
217+ func (l * Logger ) Fatal (msg string , fields ... zapcore.Field ) {
218+ fields = l .logFields (fields )
204219 l .skipCaller .Fatal (msg , fields ... )
205220}
206221
222+ func (l * Logger ) LogContext (ctx context.Context , lvl zapcore.Level , msg string , fields ... zapcore.Field ) {
223+ fields = l .logFields (fields )
224+ l .Ctx (ctx ).l .skipCaller .Log (lvl , msg , fields ... )
225+ }
226+
227+ func (l * Logger ) DebugContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
228+ l .Ctx (ctx ).l .skipCaller .Debug (msg , fields ... )
229+ }
230+
231+ func (l * Logger ) InfoContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
232+ l .Ctx (ctx ).l .skipCaller .Info (msg , fields ... )
233+ }
234+
235+ func (l * Logger ) WarnContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
236+ l .Ctx (ctx ).l .skipCaller .Warn (msg , fields ... )
237+ }
238+
239+ func (l * Logger ) ErrorContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
240+ l .Ctx (ctx ).l .skipCaller .Error (msg , fields ... )
241+ }
242+
243+ func (l * Logger ) DPanicContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
244+ l .Ctx (ctx ).l .skipCaller .DPanic (msg , fields ... )
245+ }
246+
247+ func (l * Logger ) PanicContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
248+ l .Ctx (ctx ).l .skipCaller .Panic (msg , fields ... )
249+ }
250+
251+ func (l * Logger ) FatalContext (ctx context.Context , msg string , fields ... zapcore.Field ) {
252+ l .Ctx (ctx ).l .skipCaller .Fatal (msg , fields ... )
253+ }
254+
207255func (l * Logger ) Logf (classification logging.Classification , format string , fields ... interface {}) {
208256 msg := fmt .Sprintf (format , fields ... )
209257
@@ -219,9 +267,7 @@ func (l *Logger) Logf(classification logging.Classification, format string, fiel
219267 }
220268}
221269
222- func (l * Logger ) logFields (
223- ctx context.Context , lvl zapcore.Level , msg string , fields []zapcore.Field ,
224- ) []zapcore.Field {
270+ func (l * Logger ) logFields (fields []zapcore.Field ) []zapcore.Field {
225271 if len (l .extraFields ) > 0 {
226272 fields = append (fields , l .extraFields ... )
227273 }
@@ -231,55 +277,5 @@ func (l *Logger) logFields(
231277 l .extraFieldsOnce = make ([]zap.Field , 0 )
232278 }
233279
234- if lvl >= l .minLevel {
235- l .log (ctx , lvl , msg , convertFields (fields ))
236- }
237280 return fields
238281}
239-
240- func (l * Logger ) log (
241- ctx context.Context , lvl zapcore.Level , msg string , kvs []log.KeyValue ,
242- ) {
243- if lvl >= l .minAnnotateLevel || lvl >= l .errorStatusLevel {
244- if span := trace .SpanFromContext (ctx ); span .IsRecording () {
245- if lvl >= l .minAnnotateLevel {
246- for _ , kv := range kvs {
247- span .SetAttributes (Attribute (kv .Key , kv .Value ))
248- }
249- }
250-
251- if lvl >= l .errorStatusLevel {
252- span .SetStatus (codes .Error , msg )
253- span .RecordError (fmt .Errorf ("%s" , msg ))
254- }
255- }
256- }
257-
258- record := log.Record {}
259- record .SetBody (log .StringValue (msg ))
260- record .SetSeverity (convertLevel (lvl ))
261-
262- if l .caller {
263- if fn , file , line , ok := runtimeCaller (4 + l .callerDepth ); ok {
264- if fn != "" {
265- kvs = append (kvs , log .String ("code.function" , fn ))
266- }
267- if file != "" {
268- kvs = append (kvs , log .String ("code.filepath" , file ))
269- kvs = append (kvs , log .Int ("code.lineno" , line ))
270- }
271- }
272- }
273-
274- if l .stackTrace {
275- stackTrace := make ([]byte , 2048 )
276- n := runtime .Stack (stackTrace , false )
277- kvs = append (kvs , log .String ("exception.stacktrace" , string (stackTrace [:n ])))
278- }
279-
280- if len (kvs ) > 0 {
281- record .AddAttributes (kvs ... )
282- }
283-
284- l .otelLogger .Emit (ctx , record )
285- }
0 commit comments