diff --git a/CHANGELOG.md b/CHANGELOG.md index 2025b6d..85798b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This document outlines major changes between releases. ### Added - Add handling quota limit reached error (#187) - Add slash clipping for FileName attribute (#174) +- Add new format of tag names config ## [0.32.3] - 2025-02-05 diff --git a/cmd/http-gw/app.go b/cmd/http-gw/app.go index de186fb..77d2818 100644 --- a/cmd/http-gw/app.go +++ b/cmd/http-gw/app.go @@ -114,7 +114,8 @@ type ( } tagsConfig struct { - tagLogs sync.Map + tagLogs sync.Map + defaultLvl zap.AtomicLevel } logLevelConfig struct { @@ -139,26 +140,41 @@ func newTagsConfig(v *viper.Viper, ll zapcore.Level) *tagsConfig { // panic here is analogue of the similar panic during common log level initialization. panic(err.Error()) } + t.defaultLvl = zap.NewAtomicLevelAt(ll) return &t } func newLogLevelConfig(lvl zap.AtomicLevel, tagsConfig *tagsConfig) *logLevelConfig { return &logLevelConfig{ - logLevel: lvl, + logLevel: minLogLevel(lvl, tagsConfig), tagsConfig: tagsConfig, } } +func minLogLevel(lvl zap.AtomicLevel, config *tagsConfig) zap.AtomicLevel { + minLvl := lvl + config.tagLogs.Range(func(_, value any) bool { + v := value.(zapcore.Level) + if v < minLvl.Level() { + minLvl = zap.NewAtomicLevelAt(v) + } + return true + }) + + return minLvl +} + func (l *logLevelConfig) update(cfg *viper.Viper, log *zap.Logger) { - if lvl, err := getLogLevel(cfg); err != nil { + lvl, err := getLogLevel(cfg) + if err != nil { log.Warn(logs.LogLevelWontBeUpdated, zap.Error(err), logs.TagField(logs.TagApp)) - } else { - l.logLevel.SetLevel(lvl) } if err := l.tagsConfig.update(cfg, l.logLevel.Level()); err != nil { log.Warn(logs.TagsLogConfigWontBeUpdated, zap.Error(err), logs.TagField(logs.TagApp)) } + + l.logLevel.SetLevel(minLogLevel(zap.NewAtomicLevelAt(lvl), l.tagsConfig).Level()) } func (t *tagsConfig) LevelEnabled(tag string, tgtLevel zapcore.Level) bool { @@ -170,6 +186,10 @@ func (t *tagsConfig) LevelEnabled(tag string, tgtLevel zapcore.Level) bool { return lvl.(zapcore.Level).Enabled(tgtLevel) } +func (t *tagsConfig) DefaultLevel() zap.AtomicLevel { + return t.defaultLvl +} + func (t *tagsConfig) update(cfg *viper.Viper, ll zapcore.Level) error { tags, err := fetchLogTagsConfig(cfg, ll) if err != nil { @@ -194,6 +214,7 @@ func (t *tagsConfig) update(cfg *viper.Viper, ll zapcore.Level) error { for k, v := range tags { t.tagLogs.Store(k, v) } + t.defaultLvl = zap.NewAtomicLevelAt(ll) return nil } diff --git a/cmd/http-gw/logger.go b/cmd/http-gw/logger.go index 91105f7..841e507 100644 --- a/cmd/http-gw/logger.go +++ b/cmd/http-gw/logger.go @@ -41,6 +41,7 @@ type zapCoreTagFilterWrapper struct { type TagFilterSettings interface { LevelEnabled(tag string, lvl zapcore.Level) bool + DefaultLevel() zap.AtomicLevel } func (c *zapCoreTagFilterWrapper) Enabled(level zapcore.Level) bool { @@ -73,14 +74,10 @@ func (c *zapCoreTagFilterWrapper) Write(entry zapcore.Entry, fields []zapcore.Fi func (c *zapCoreTagFilterWrapper) shouldSkip(entry zapcore.Entry, fields []zap.Field) bool { for _, field := range fields { if field.Key == logs.TagFieldName && field.Type == zapcore.StringType { - if !c.settings.LevelEnabled(field.String, entry.Level) { - return true - } - break + return !c.settings.LevelEnabled(field.String, entry.Level) } } - - return false + return !c.core.Enabled(entry.Level) } func (c *zapCoreTagFilterWrapper) Sync() error { diff --git a/cmd/http-gw/settings.go b/cmd/http-gw/settings.go index 132c627..982b401 100644 --- a/cmd/http-gw/settings.go +++ b/cmd/http-gw/settings.go @@ -113,7 +113,7 @@ const ( cfgLoggerTags = "logger.tags" cfgLoggerTagsPrefixTmpl = cfgLoggerTags + ".%d." - cfgLoggerTagsNameTmpl = cfgLoggerTagsPrefixTmpl + "name" + cfgLoggerTagsNameTmpl = cfgLoggerTagsPrefixTmpl + "names" cfgLoggerTagsLevelTmpl = cfgLoggerTagsPrefixTmpl + "level" // Wallet. @@ -516,8 +516,8 @@ func fetchLogTagsConfig(v *viper.Viper, defaultLvl zapcore.Level) (map[string]za res := make(map[string]zapcore.Level) for i := 0; ; i++ { - name := v.GetString(fmt.Sprintf(cfgLoggerTagsNameTmpl, i)) - if name == "" { + tagNames := v.GetString(fmt.Sprintf(cfgLoggerTagsNameTmpl, i)) + if tagNames == "" { break } @@ -529,7 +529,12 @@ func fetchLogTagsConfig(v *viper.Viper, defaultLvl zapcore.Level) (map[string]za } } - res[name] = lvl + for _, tagName := range strings.Split(tagNames, ",") { + tagName = strings.TrimSpace(tagName) + if len(tagName) != 0 { + res[tagName] = lvl + } + } } if len(res) == 0 && !v.IsSet(cfgLoggerTags) { diff --git a/config/config.env b/config/config.env index 0ff2dec..72492d8 100644 --- a/config/config.env +++ b/config/config.env @@ -20,8 +20,9 @@ HTTP_GW_LOGGER_SAMPLING_ENABLED=false HTTP_GW_LOGGER_SAMPLING_INITIAL=100 HTTP_GW_LOGGER_SAMPLING_THEREAFTER=100 HTTP_GW_LOGGER_SAMPLING_INTERVAL=1s -HTTP_GW_LOGGER_TAGS_0_NAME=app -HTTP_GW_LOGGER_TAGS_1_NAME=datapath +HTTP_GW_LOGGER_TAGS_0_NAMES=app,datapath +HTTP_GW_LOGGER_TAGS_0_LEVEL=level +HTTP_GW_LOGGER_TAGS_1_NAME=external_storage_tree HTTP_GW_SERVER_0_ADDRESS=0.0.0.0:443 HTTP_GW_SERVER_0_TLS_ENABLED=false diff --git a/config/config.yaml b/config/config.yaml index 05bba2e..ccd025e 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -30,8 +30,7 @@ logger: thereafter: 100 interval: 1s tags: - - name: app - - name: datapath + - names: app,datapath level: debug server: diff --git a/docs/gate-configuration.md b/docs/gate-configuration.md index 628d3c7..1dec574 100644 --- a/docs/gate-configuration.md +++ b/docs/gate-configuration.md @@ -176,10 +176,9 @@ logger: thereafter: 100 interval: 1s tags: - - name: "app" + - names: "app,datapath" level: info - - name: "datapath" - - name: "external_storage_tree" + - names: "external_storage_tree" ``` | Parameter | Type | SIGHUP reload | Default value | Description | @@ -199,14 +198,14 @@ parameter. Available tags: ```yaml tags: - - name: "app" + - names: "app,datapath" level: info ``` -| Parameter | Type | SIGHUP reload | Default value | Description | -|-----------------------|------------|---------------|---------------------------|-------------------------------------------------------------------------------------------------------| -| `name` | `string` | yes | | Tag name. Possible values see below in `Tag values` section. | -| `level` | `string` | yes | Value from `logger.level` | Logging level for specific tag. Possible values: `debug`, `info`, `warn`, `dpanic`, `panic`, `fatal`. | +| Parameter | Type | SIGHUP reload | Default value | Description | +|-----------|------------|---------------|---------------------------|-------------------------------------------------------------------------------------------------------| +| `names` | `[]string` | yes | | Tag names separated by `,`. Possible values see below in `Tag values` section. | +| `level` | `string` | yes | Value from `logger.level` | Logging level for specific tag. Possible values: `debug`, `info`, `warn`, `dpanic`, `panic`, `fatal`. | ### Tag values