Slide 12
Slide 12 text
©2019GVA TECH Co., K. K.
ロギングメソッド
- zapに依存し、JSON形式でロギング
- 関数レベルでの拡張性
- Loggerのconfigはパッケージ変数
func (e *ExtendError) Log(fields []zapcore.Field) {
// 中略
if fields == nil {
fields = defaultFields(e)
}
switch e.Severity {
case zapcore.DebugLevel:
// Loggerはパッケージ変数
Logger.Debug(string(e.Kind), fields...)
case zapcore.InfoLevel:
Logger.Info(string(e.Kind), fields...)
case zapcore.WarnLevel:
default:
err := ExtendError{/* invalidなSeverityエラー (略) */}
err.Log(nil)
fallthrough // 元のエラーも ErrorLevel でログに出力しておく
case zapcore.ErrorLevel:
Logger.Error(string(e.Kind), fields...)
case zapcore.DPanicLevel:
Logger.DPanic(string(e.Kind), fields...)
case zapcore.PanicLevel:
Logger.Panic(string(e.Kind), fields...)
case zapcore.FatalLevel:
Logger.Fatal(string(e.Kind), fields...)
}
}
func defaultFields(e *ExtendError) []zapcore.Field {
return []zapcore.Field{
zap.String("error_id", e.id.String()),
zap.String("error", e.Error()),
zap.String("expected_cause", e.ExpectedCause),
zap.String("cause_api_name", e.CauseAPIName),
zap.String("handler_name", e.HandlerName),
zap.String("occur_function_name", e.OccurFuncName),
zap.Object("context_parameters", zapcore.ObjectMarshalerFunc(
func(inner zapcore.ObjectEncoder) error {
for k, v := range e.ContextParams {
inner.AddString(k, v)
}
return nil
})),
}
}