package fog import ( "go.uber.org/zap" "go.uber.org/zap/buffer" "go.uber.org/zap/zapcore" ) // encoder is a custom Zap encoder that is tailored for Google cloud // monitoring type encoder struct { zapcore.Encoder } func newEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder { return encoder{zapcore.NewJSONEncoder(cfg)} } // Clone implements [go.uber.org/zap/zapcore.Encoder], preserving our custom // encoder when the logger is cloned. func (e encoder) Clone() zapcore.Encoder { return encoder{e.Encoder.Clone()} } // EncodeEntry implements [go.uber.org/zap/zapcore.Encoder]. func (e encoder) EncodeEntry(entry zapcore.Entry, fields []zapcore.Field) (*buffer.Buffer, error) { fields = append(fields, zap.Object(SourceKey, caller{&entry.Caller})) return e.Encoder.EncodeEntry(entry, fields) } // caller implements behavior for producing logs with caller information that // Google cloud understands type caller struct { *zapcore.EntryCaller } func (c caller) MarshalLogObject(enc zapcore.ObjectEncoder) error { enc.AddString("function", c.EntryCaller.Function) enc.AddString("file", c.EntryCaller.File) enc.AddInt("line", c.EntryCaller.Line) return nil } func encodeLevel() zapcore.LevelEncoder { return func(l zapcore.Level, enc zapcore.PrimitiveArrayEncoder) { switch { case l == 0: enc.AppendString(Info) case l < 0: // Everything below Info is Debug enc.AppendString(Debug) case l == zap.ErrorLevel: enc.AppendString(Error) } } }