diff --git a/formatter_json.go b/formatter_json.go index c86aaa6..5536368 100644 --- a/formatter_json.go +++ b/formatter_json.go @@ -42,6 +42,8 @@ type JSONFormatter struct { PrettyPrint bool // TimeFormat the time format layout. default is DefaultTimeFormat TimeFormat string + // CallerFormatFunc the caller format layout. default is defined by CallerFlag + CallerFormatFunc CallerFormatFn } // NewJSONFormatter create new JSONFormatter @@ -89,7 +91,11 @@ func (f *JSONFormatter) Format(r *Record) ([]byte, error) { case field == FieldKeyTimestamp: logData[outName] = r.timestamp() case field == FieldKeyCaller && r.Caller != nil: - logData[outName] = formatCaller(r.Caller, r.CallerFlag) + if f.CallerFormatFunc != nil { + logData[outName] = f.CallerFormatFunc(r.Caller) + } else { + logData[outName] = formatCaller(r.Caller, r.CallerFlag) + } case field == FieldKeyLevel: logData[outName] = r.LevelName() case field == FieldKeyChannel: diff --git a/formatter_text.go b/formatter_text.go index dd2c3ee..c8acb0b 100644 --- a/formatter_text.go +++ b/formatter_text.go @@ -43,6 +43,8 @@ type TextFormatter struct { // EncodeFunc data encode for Record.Data, Record.Extra, etc. // Default is encode by EncodeToString() EncodeFunc func(v any) string + // CallerFormatFunc the caller format layout. default is defined by CallerFlag + CallerFormatFunc CallerFormatFn } // NewTextFormatter create new TextFormatter @@ -118,7 +120,13 @@ func (f *TextFormatter) Format(r *Record) ([]byte, error) { case field == FieldKeyTimestamp: buf.WriteString(r.timestamp()) case field == FieldKeyCaller && r.Caller != nil: - buf.WriteString(formatCaller(r.Caller, r.CallerFlag)) + var callerLog string + if f.CallerFormatFunc != nil { + callerLog = f.CallerFormatFunc(r.Caller) + } else { + callerLog = formatCaller(r.Caller, r.CallerFlag) + } + buf.WriteString(callerLog) case field == FieldKeyLevel: // output colored logs for console if f.EnableColor { diff --git a/util.go b/util.go index 09944da..f9ebfa3 100644 --- a/util.go +++ b/util.go @@ -24,6 +24,8 @@ import ( // return nil // } +type CallerFormatFn func(rf *runtime.Frame) (cs string) + func buildLowerLevelName() map[Level]string { mp := make(map[Level]string, len(LevelNames)) for level, s := range LevelNames {