[#224] Refactor logger tag configuration
Some checks failed
/ DCO (pull_request) Successful in 26s
/ Vulncheck (pull_request) Successful in 53s
/ Builds (pull_request) Successful in 59s
/ OCI image (pull_request) Successful in 1m21s
/ Lint (pull_request) Successful in 1m51s
/ Tests (pull_request) Successful in 53s
/ Integration tests (pull_request) Failing after 1m52s

Signed-off-by: Pavel Pogodaev <p.pogodaev@yadro.com>
This commit is contained in:
Pavel Pogodaev 2025-03-21 13:38:43 +03:00
parent 0f73da258b
commit 06db52e53d
6 changed files with 51 additions and 23 deletions

View file

@ -119,10 +119,15 @@ type (
logLevelConfig struct {
logLevel zap.AtomicLevel
maxLevel zap.AtomicLevel
tagsConfig *tagsConfig
}
)
func (l *logLevelConfig) MaxLevel() zap.AtomicLevel {
return l.maxLevel
}
func newLogLevel(v *viper.Viper) zap.AtomicLevel {
ll, err := getLogLevel(v)
if err != nil {
@ -143,12 +148,27 @@ func newTagsConfig(v *viper.Viper, ll zapcore.Level) *tagsConfig {
}
func newLogLevelConfig(lvl zap.AtomicLevel, tagsConfig *tagsConfig) *logLevelConfig {
maxLvl := maxLogLevel(lvl, tagsConfig)
return &logLevelConfig{
logLevel: lvl,
logLevel: maxLvl,
tagsConfig: tagsConfig,
maxLevel: maxLvl,
}
}
func maxLogLevel(lvl zap.AtomicLevel, config *tagsConfig) zap.AtomicLevel {
maxLvl := lvl
config.tagLogs.Range(func(_, value any) bool {
v := value.(zapcore.Level)
if v > maxLvl.Level() {
maxLvl = zap.NewAtomicLevelAt(v)
}
return true
})
return maxLvl
}
func (l *logLevelConfig) update(cfg *viper.Viper, log *zap.Logger) {
if lvl, err := getLogLevel(cfg); err != nil {
log.Warn(logs.LogLevelWontBeUpdated, zap.Error(err), logs.TagField(logs.TagApp))
@ -159,6 +179,8 @@ func (l *logLevelConfig) update(cfg *viper.Viper, log *zap.Logger) {
if err := l.tagsConfig.update(cfg, l.logLevel.Level()); err != nil {
log.Warn(logs.TagsLogConfigWontBeUpdated, zap.Error(err), logs.TagField(logs.TagApp))
}
l.maxLevel = maxLogLevel(l.logLevel, l.tagsConfig)
}
func (t *tagsConfig) LevelEnabled(tag string, tgtLevel zapcore.Level) bool {

View file

@ -36,6 +36,7 @@ var _ zapcore.Core = (*zapCoreTagFilterWrapper)(nil)
type zapCoreTagFilterWrapper struct {
core zapcore.Core
settings TagFilterSettings
maxLvl MaxLevelSetting
extra []zap.Field
}
@ -43,6 +44,10 @@ type TagFilterSettings interface {
LevelEnabled(tag string, lvl zapcore.Level) bool
}
type MaxLevelSetting interface {
MaxLevel() zap.AtomicLevel
}
func (c *zapCoreTagFilterWrapper) Enabled(level zapcore.Level) bool {
return c.core.Enabled(level)
}
@ -51,6 +56,7 @@ func (c *zapCoreTagFilterWrapper) With(fields []zapcore.Field) zapcore.Core {
return &zapCoreTagFilterWrapper{
core: c.core.With(fields),
settings: c.settings,
maxLvl: c.maxLvl,
extra: append(c.extra, fields...),
}
}
@ -73,14 +79,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.maxLvl.MaxLevel().Enabled(entry.Level)
}
func (c *zapCoreTagFilterWrapper) Sync() error {

View file

@ -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) {

View file

@ -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

View file

@ -30,8 +30,7 @@ logger:
thereafter: 100
interval: 1s
tags:
- name: app
- name: datapath
- names: app,datapath
level: debug
server:

View file

@ -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