diff --git a/core/logx/config.go b/core/logx/config.go index ffa4c3f94..8834648b0 100644 --- a/core/logx/config.go +++ b/core/logx/config.go @@ -1,68 +1,70 @@ package logx -// A LogConf is a logging config. -type LogConf struct { - // ServiceName represents the service name. - ServiceName string `json:",optional"` - // Mode represents the logging mode, default is `console`. - // console: log to console. - // file: log to file. - // volume: used in k8s, prepend the hostname to the log file name. - Mode string `json:",default=console,options=[console,file,volume]"` - // Encoding represents the encoding type, default is `json`. - // json: json encoding. - // plain: plain text encoding, typically used in development. - Encoding string `json:",default=json,options=[json,plain]"` - // TimeFormat represents the time format, default is `2006-01-02T15:04:05.000Z07:00`. - TimeFormat string `json:",optional"` - // Path represents the log file path, default is `logs`. - Path string `json:",default=logs"` - // Level represents the log level, default is `info`. - Level string `json:",default=info,options=[debug,info,error,severe]"` - // MaxContentLength represents the max content bytes, default is no limit. - MaxContentLength uint32 `json:",optional"` - // Compress represents whether to compress the log file, default is `false`. - Compress bool `json:",optional"` - // Stat represents whether to log statistics, default is `true`. - Stat bool `json:",default=true"` - // KeepDays represents how many days the log files will be kept. Default to keep all files. - // Only take effect when Mode is `file` or `volume`, both work when Rotation is `daily` or `size`. - KeepDays int `json:",optional"` - // StackCooldownMillis represents the cooldown time for stack logging, default is 100ms. - StackCooldownMillis int `json:",default=100"` - // MaxBackups represents how many backup log files will be kept. 0 means all files will be kept forever. - // Only take effect when RotationRuleType is `size`. - // Even though `MaxBackups` sets 0, log files will still be removed - // if the `KeepDays` limitation is reached. - MaxBackups int `json:",default=0"` - // MaxSize represents how much space the writing log file takes up. 0 means no limit. The unit is `MB`. - // Only take effect when RotationRuleType is `size` - MaxSize int `json:",default=0"` - // Rotation represents the type of log rotation rule. Default is `daily`. - // daily: daily rotation. - // size: size limited rotation. - Rotation string `json:",default=daily,options=[daily,size]"` - // FileTimeFormat represents the time format for file name, default is `2006-01-02T15:04:05.000Z07:00`. - FileTimeFormat string `json:",optional"` - // LogKey represents the log key. - LogKey logKeyConf `json:",optional"` -} +type ( + // A LogConf is a logging config. + LogConf struct { + // ServiceName represents the service name. + ServiceName string `json:",optional"` + // Mode represents the logging mode, default is `console`. + // console: log to console. + // file: log to file. + // volume: used in k8s, prepend the hostname to the log file name. + Mode string `json:",default=console,options=[console,file,volume]"` + // Encoding represents the encoding type, default is `json`. + // json: json encoding. + // plain: plain text encoding, typically used in development. + Encoding string `json:",default=json,options=[json,plain]"` + // TimeFormat represents the time format, default is `2006-01-02T15:04:05.000Z07:00`. + TimeFormat string `json:",optional"` + // Path represents the log file path, default is `logs`. + Path string `json:",default=logs"` + // Level represents the log level, default is `info`. + Level string `json:",default=info,options=[debug,info,error,severe]"` + // MaxContentLength represents the max content bytes, default is no limit. + MaxContentLength uint32 `json:",optional"` + // Compress represents whether to compress the log file, default is `false`. + Compress bool `json:",optional"` + // Stat represents whether to log statistics, default is `true`. + Stat bool `json:",default=true"` + // KeepDays represents how many days the log files will be kept. Default to keep all files. + // Only take effect when Mode is `file` or `volume`, both work when Rotation is `daily` or `size`. + KeepDays int `json:",optional"` + // StackCooldownMillis represents the cooldown time for stack logging, default is 100ms. + StackCooldownMillis int `json:",default=100"` + // MaxBackups represents how many backup log files will be kept. 0 means all files will be kept forever. + // Only take effect when RotationRuleType is `size`. + // Even though `MaxBackups` sets 0, log files will still be removed + // if the `KeepDays` limitation is reached. + MaxBackups int `json:",default=0"` + // MaxSize represents how much space the writing log file takes up. 0 means no limit. The unit is `MB`. + // Only take effect when RotationRuleType is `size` + MaxSize int `json:",default=0"` + // Rotation represents the type of log rotation rule. Default is `daily`. + // daily: daily rotation. + // size: size limited rotation. + Rotation string `json:",default=daily,options=[daily,size]"` + // FileTimeFormat represents the time format for file name, default is `2006-01-02T15:04:05.000Z07:00`. + FileTimeFormat string `json:",optional"` + // FieldKeys represents the field keys. + FieldKeys fieldKeyConf `json:",optional"` + } -type logKeyConf struct { - // CallerKey represents the caller key. - CallerKey string `json:",default=caller"` - // ContentKey represents the content key. - ContentKey string `json:",default=content"` - // DurationKey represents the duration key. - DurationKey string `json:",default=duration"` - // LevelKey represents the level key. - LevelKey string `json:",default=level"` - // SpanKey represents the span key. - SpanKey string `json:",default=span"` - // TimestampKey represents the timestamp key. - TimestampKey string `json:",default=@timestamp"` - // TraceKey represents the trace key. - TraceKey string `json:",default=trace"` - // TruncatedKey represents the truncated key. - TruncatedKey string `json:",default=truncated"` -} + fieldKeyConf struct { + // CallerKey represents the caller key. + CallerKey string `json:",default=caller"` + // ContentKey represents the content key. + ContentKey string `json:",default=content"` + // DurationKey represents the duration key. + DurationKey string `json:",default=duration"` + // LevelKey represents the level key. + LevelKey string `json:",default=level"` + // SpanKey represents the span key. + SpanKey string `json:",default=span"` + // TimestampKey represents the timestamp key. + TimestampKey string `json:",default=@timestamp"` + // TraceKey represents the trace key. + TraceKey string `json:",default=trace"` + // TruncatedKey represents the truncated key. + TruncatedKey string `json:",default=truncated"` + } +) diff --git a/core/logx/logs.go b/core/logx/logs.go index f3c872d1d..843e363e5 100644 --- a/core/logx/logs.go +++ b/core/logx/logs.go @@ -276,8 +276,8 @@ func SetUp(c LogConf) (err error) { // Because multiple services in one process might call SetUp respectively. // Need to wait for the first caller to complete the execution. setupOnce.Do(func() { - setupLogLevel(c) - setupLogKey(c.LogKey) + setupLogLevel(c.Level) + setupFieldKeys(c.FieldKeys) if !c.Stat { DisableStat() @@ -481,8 +481,35 @@ func handleOptions(opts []LogOption) { } } -func setupLogLevel(c LogConf) { - switch c.Level { +func setupFieldKeys(c fieldKeyConf) { + if len(c.CallerKey) > 0 { + callerKey = c.CallerKey + } + if len(c.ContentKey) > 0 { + contentKey = c.ContentKey + } + if len(c.DurationKey) > 0 { + durationKey = c.DurationKey + } + if len(c.LevelKey) > 0 { + levelKey = c.LevelKey + } + if len(c.SpanKey) > 0 { + spanKey = c.SpanKey + } + if len(c.TimestampKey) > 0 { + timestampKey = c.TimestampKey + } + if len(c.TraceKey) > 0 { + traceKey = c.TraceKey + } + if len(c.TruncatedKey) > 0 { + truncatedKey = c.TruncatedKey + } +} + +func setupLogLevel(level string) { + switch level { case levelDebug: SetLevel(DebugLevel) case levelInfo: @@ -580,30 +607,3 @@ func writeStack(msg string) { func writeStat(msg string) { getWriter().Stat(msg, mergeGlobalFields(addCaller())...) } - -func setupLogKey(c logKeyConf) { - if c.CallerKey != "" { - callerKey = c.CallerKey - } - if c.ContentKey != "" { - contentKey = c.ContentKey - } - if c.DurationKey != "" { - durationKey = c.DurationKey - } - if c.LevelKey != "" { - levelKey = c.LevelKey - } - if c.SpanKey != "" { - spanKey = c.SpanKey - } - if c.TimestampKey != "" { - timestampKey = c.TimestampKey - } - if c.TraceKey != "" { - traceKey = c.TraceKey - } - if c.TruncatedKey != "" { - truncatedKey = c.TruncatedKey - } -} diff --git a/core/logx/logs_test.go b/core/logx/logs_test.go index 59eb114f6..0c3638940 100644 --- a/core/logx/logs_test.go +++ b/core/logx/logs_test.go @@ -779,15 +779,9 @@ func TestSetup(t *testing.T) { MaxBackups: 3, MaxSize: 1024 * 1024, })) - setupLogLevel(LogConf{ - Level: levelInfo, - }) - setupLogLevel(LogConf{ - Level: levelError, - }) - setupLogLevel(LogConf{ - Level: levelSevere, - }) + setupLogLevel(levelInfo) + setupLogLevel(levelError) + setupLogLevel(levelSevere) _, err := createOutput("") assert.NotNil(t, err) Disable() @@ -1167,7 +1161,7 @@ func TestLogKey(t *testing.T) { Mode: "console", Encoding: "json", TimeFormat: timeFormat, - LogKey: logKeyConf{ + FieldKeys: fieldKeyConf{ CallerKey: "_caller", ContentKey: "_content", DurationKey: "_duration", @@ -1180,7 +1174,7 @@ func TestLogKey(t *testing.T) { }) t.Cleanup(func() { - setupLogKey(logKeyConf{ + setupFieldKeys(fieldKeyConf{ CallerKey: defaultCallerKey, ContentKey: defaultContentKey, DurationKey: defaultDurationKey, diff --git a/core/logx/vars.go b/core/logx/vars.go index 62dc96177..9079120a7 100644 --- a/core/logx/vars.go +++ b/core/logx/vars.go @@ -63,17 +63,6 @@ const ( defaultTruncatedKey = "truncated" ) -var ( - callerKey = defaultCallerKey - contentKey = defaultContentKey - durationKey = defaultDurationKey - levelKey = defaultLevelKey - spanKey = defaultSpanKey - timestampKey = defaultTimestampKey - traceKey = defaultTraceKey - truncatedKey = defaultTruncatedKey -) - var ( // ErrLogPathNotSet is an error that indicates the log path is not set. ErrLogPathNotSet = errors.New("log path must be set") @@ -84,3 +73,14 @@ var ( truncatedField = Field(truncatedKey, true) ) + +var ( + callerKey = defaultCallerKey + contentKey = defaultContentKey + durationKey = defaultDurationKey + levelKey = defaultLevelKey + spanKey = defaultSpanKey + timestampKey = defaultTimestampKey + traceKey = defaultTraceKey + truncatedKey = defaultTruncatedKey +) diff --git a/core/logx/writer.go b/core/logx/writer.go index c71408746..7a359c63b 100644 --- a/core/logx/writer.go +++ b/core/logx/writer.go @@ -212,7 +212,6 @@ func newFileWriter(c LogConf) (Writer, error) { statFile := path.Join(c.Path, statFilename) handleOptions(opts) - setupLogLevel(c) if infoLog, err = createOutput(accessFile); err != nil { return nil, err