diff --git a/cmd/frostfs-node/config/logger/config_test.go b/cmd/frostfs-node/config/logger/config_test.go
index ffe8ac693..796ad529e 100644
--- a/cmd/frostfs-node/config/logger/config_test.go
+++ b/cmd/frostfs-node/config/logger/config_test.go
@@ -22,6 +22,9 @@ func TestLoggerSection_Level(t *testing.T) {
require.Equal(t, "debug", loggerconfig.Level(c))
require.Equal(t, "journald", loggerconfig.Destination(c))
require.Equal(t, true, loggerconfig.Timestamp(c))
+ tags := loggerconfig.Tags(c)
+ require.Equal(t, "main, morph", tags[0][0])
+ require.Equal(t, "debug", tags[0][1])
}
configtest.ForEachFileType(path, fileConfigTest)
diff --git a/cmd/frostfs-node/morph.go b/cmd/frostfs-node/morph.go
index 657e22389..6e1a15f44 100644
--- a/cmd/frostfs-node/morph.go
+++ b/cmd/frostfs-node/morph.go
@@ -14,6 +14,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
netmapEvent "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event/netmap"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/subscriber"
+ "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/rand"
"github.com/nspcc-dev/neo-go/pkg/core/block"
"github.com/nspcc-dev/neo-go/pkg/core/state"
@@ -83,7 +84,7 @@ func initMorphClient(ctx context.Context, c *cfg) {
cli, err := client.New(ctx,
c.key,
client.WithDialTimeout(morphconfig.DialTimeout(c.appCfg)),
- client.WithLogger(c.log),
+ client.WithLogger(c.log.WithTag(logger.TagMorph)),
client.WithMetrics(c.metricsCollector.MorphClientMetrics()),
client.WithEndpoints(addresses...),
client.WithConnLostCallback(func() {
@@ -164,6 +165,7 @@ func listenMorphNotifications(ctx context.Context, c *cfg) {
err error
subs subscriber.Subscriber
)
+ log := c.log.WithTag(logger.TagMorph)
fromSideChainBlock, err := c.persistate.UInt32(persistateSideChainLastBlockKey)
if err != nil {
@@ -172,14 +174,14 @@ func listenMorphNotifications(ctx context.Context, c *cfg) {
}
subs, err = subscriber.New(ctx, &subscriber.Params{
- Log: c.log,
+ Log: log,
StartFromBlock: fromSideChainBlock,
Client: c.cfgMorph.client,
})
fatalOnErr(err)
lis, err := event.NewListener(event.ListenerParams{
- Logger: c.log,
+ Logger: log,
Subscriber: subs,
})
fatalOnErr(err)
@@ -197,7 +199,7 @@ func listenMorphNotifications(ctx context.Context, c *cfg) {
setNetmapNotificationParser(c, newEpochNotification, func(src *state.ContainedNotificationEvent) (event.Event, error) {
res, err := netmapEvent.ParseNewEpoch(src)
if err == nil {
- c.log.Info(ctx, logs.FrostFSNodeNewEpochEventFromSidechain,
+ log.Info(ctx, logs.FrostFSNodeNewEpochEventFromSidechain,
zap.Uint64("number", res.(netmapEvent.NewEpoch).EpochNumber()),
)
}
@@ -208,11 +210,11 @@ func listenMorphNotifications(ctx context.Context, c *cfg) {
registerNotificationHandlers(c.cfgContainer.scriptHash, lis, c.cfgContainer.parsers, c.cfgContainer.subscribers)
registerBlockHandler(lis, func(ctx context.Context, block *block.Block) {
- c.log.Debug(ctx, logs.FrostFSNodeNewBlock, zap.Uint32("index", block.Index))
+ log.Debug(ctx, logs.FrostFSNodeNewBlock, zap.Uint32("index", block.Index))
err = c.persistate.SetUInt32(persistateSideChainLastBlockKey, block.Index)
if err != nil {
- c.log.Warn(ctx, logs.FrostFSNodeCantUpdatePersistentState,
+ log.Warn(ctx, logs.FrostFSNodeCantUpdatePersistentState,
zap.String("chain", "side"),
zap.Uint32("block_index", block.Index))
}
diff --git a/cmd/frostfs-node/session.go b/cmd/frostfs-node/session.go
index 2f3c9cbfe..fbfe3f5e6 100644
--- a/cmd/frostfs-node/session.go
+++ b/cmd/frostfs-node/session.go
@@ -14,6 +14,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/session/storage"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/session/storage/persistent"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/session/storage/temporary"
+ "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/session"
sessionGRPC "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/session/grpc"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
@@ -55,7 +56,7 @@ func initSessionService(c *cfg) {
server := sessionTransportGRPC.New(
sessionSvc.NewSignService(
&c.key.PrivateKey,
- sessionSvc.NewExecutionService(c.privateTokenStore, c.respSvc, c.log),
+ sessionSvc.NewExecutionService(c.privateTokenStore, c.respSvc, c.log.WithTag(logger.TagSessionSvc)),
),
)
diff --git a/cmd/frostfs-node/tree.go b/cmd/frostfs-node/tree.go
index 65414f0ca..9a86591a3 100644
--- a/cmd/frostfs-node/tree.go
+++ b/cmd/frostfs-node/tree.go
@@ -14,6 +14,7 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
containerEvent "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event/container"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/tree"
+ "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
"go.uber.org/zap"
"google.golang.org/grpc"
@@ -56,7 +57,7 @@ func initTreeService(c *cfg) {
tree.WithFrostfsidSubjectProvider(c.shared.frostfsidClient),
tree.WithNetmapSource(c.netMapSource),
tree.WithPrivateKey(&c.key.PrivateKey),
- tree.WithLogger(c.log),
+ tree.WithLogger(c.log.WithTag(logger.TagTreeSvc)),
tree.WithStorage(c.cfgObject.cfgLocalStorage.localStorage),
tree.WithContainerCacheSize(treeConfig.CacheSize()),
tree.WithReplicationTimeout(treeConfig.ReplicationTimeout()),
diff --git a/config/example/node.env b/config/example/node.env
index 010b6840c..3d0114914 100644
--- a/config/example/node.env
+++ b/config/example/node.env
@@ -1,6 +1,8 @@
FROSTFS_LOGGER_LEVEL=debug
FROSTFS_LOGGER_DESTINATION=journald
FROSTFS_LOGGER_TIMESTAMP=true
+FROSTFS_LOGGER_TAGS_0_NAMES="main, morph"
+FROSTFS_LOGGER_TAGS_0_LEVEL="debug"
FROSTFS_PPROF_ENABLED=true
FROSTFS_PPROF_ADDRESS=localhost:6060
diff --git a/config/example/node.json b/config/example/node.json
index b26c35d2c..9fa181cd2 100644
--- a/config/example/node.json
+++ b/config/example/node.json
@@ -2,7 +2,13 @@
"logger": {
"level": "debug",
"destination": "journald",
- "timestamp": true
+ "timestamp": true,
+ "tags": [
+ {
+ "names": "main, morph",
+ "level": "debug"
+ }
+ ]
},
"pprof": {
"enabled": true,
diff --git a/config/example/node.yaml b/config/example/node.yaml
index 58b687d5c..d26d1fe6a 100644
--- a/config/example/node.yaml
+++ b/config/example/node.yaml
@@ -2,6 +2,9 @@ logger:
level: debug # logger level: one of "debug", "info" (default), "warn", "error", "dpanic", "panic", "fatal"
destination: journald # logger destination: one of "stdout" (default), "journald"
timestamp: true
+ tags:
+ - names: "main, morph"
+ level: debug
systemdnotify:
enabled: true
diff --git a/docs/storage-node-configuration.md b/docs/storage-node-configuration.md
index 51f0a9669..e940a827a 100644
--- a/docs/storage-node-configuration.md
+++ b/docs/storage-node-configuration.md
@@ -111,11 +111,21 @@ Contains logger parameters.
```yaml
logger:
level: info
+ tags:
+ - names: "main, morph"
+ level: debug
```
-| Parameter | Type | Default value | Description |
-|-----------|----------|---------------|---------------------------------------------------------------------------------------------------|
-| `level` | `string` | `info` | Logging level.
Possible values: `debug`, `info`, `warn`, `error`, `dpanic`, `panic`, `fatal` |
+| Parameter | Type | Default value | Description |
+|-----------|-----------------------------------------------|---------------|---------------------------------------------------------------------------------------------------|
+| `level` | `string` | `info` | Logging level.
Possible values: `debug`, `info`, `warn`, `error`, `dpanic`, `panic`, `fatal` |
+| `tags` | list of [tags descriptions](#tags-subsection) | | Array of tags description. |
+
+## `tags` subsection
+| Parameter | Type | Default value | Description |
+|-----------|----------|---------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `names` | `string` | | List of components divided by `,`.
Possible values: `main`, `morph`, `grpc_svc`, `ir`, `processor`, `engine`, `blobovnicza`, `blobstor`, `fstree`, `gc`, `shard`, `writecache`, `deletesvc`, `getsvc`, `searchsvc`, `sessionsvc`, `treesvc`, `policer`, `replicator`. |
+| `level` | `string` | | Logging level for the components from `names`, overrides default logging level. |
# `contracts` section
Contains override values for FrostFS side-chain contract hashes. Most of the time contract
diff --git a/pkg/local_object_storage/blobovnicza/blobovnicza.go b/pkg/local_object_storage/blobovnicza/blobovnicza.go
index 08ef8b86c..22987d69d 100644
--- a/pkg/local_object_storage/blobovnicza/blobovnicza.go
+++ b/pkg/local_object_storage/blobovnicza/blobovnicza.go
@@ -110,7 +110,7 @@ func WithFullSizeLimit(lim uint64) Option {
// WithLogger returns an option to specify Blobovnicza's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l.With(zap.String("component", "Blobovnicza"))
+ c.log = l.WithTag(logger.TagBlobovnicza)
}
}
diff --git a/pkg/local_object_storage/blobstor/blobstor.go b/pkg/local_object_storage/blobstor/blobstor.go
index f850f48b4..3aeeb09a4 100644
--- a/pkg/local_object_storage/blobstor/blobstor.go
+++ b/pkg/local_object_storage/blobstor/blobstor.go
@@ -91,7 +91,7 @@ func WithStorages(st []SubStorage) Option {
// WithLogger returns option to specify BlobStor's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l.With(zap.String("component", "BlobStor"))
+ c.log = l.WithTag(logger.TagBlobstor)
}
}
diff --git a/pkg/local_object_storage/blobstor/fstree/option.go b/pkg/local_object_storage/blobstor/fstree/option.go
index 7155ddcbb..bc8c7c585 100644
--- a/pkg/local_object_storage/blobstor/fstree/option.go
+++ b/pkg/local_object_storage/blobstor/fstree/option.go
@@ -4,7 +4,6 @@ import (
"io/fs"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
- "go.uber.org/zap"
)
type Option func(*FSTree)
@@ -53,6 +52,6 @@ func WithFileCounter(c FileCounter) Option {
func WithLogger(l *logger.Logger) Option {
return func(f *FSTree) {
- f.log = l.With(zap.String("component", "FSTree"))
+ f.log = l.WithTag(logger.TagFSTree)
}
}
diff --git a/pkg/local_object_storage/engine/engine.go b/pkg/local_object_storage/engine/engine.go
index a915c9bd6..05e839162 100644
--- a/pkg/local_object_storage/engine/engine.go
+++ b/pkg/local_object_storage/engine/engine.go
@@ -224,7 +224,7 @@ func New(opts ...Option) *StorageEngine {
// WithLogger returns option to set StorageEngine's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l
+ c.log = l.WithTag(logger.TagEngine)
}
}
diff --git a/pkg/local_object_storage/shard/gc.go b/pkg/local_object_storage/shard/gc.go
index 32a377cd5..3f329095c 100644
--- a/pkg/local_object_storage/shard/gc.go
+++ b/pkg/local_object_storage/shard/gc.go
@@ -495,7 +495,7 @@ func (s *Shard) collectExpiredTombstones(ctx context.Context, e Event) {
}()
epoch := e.(newEpoch).epoch
- log := s.log.With(zap.Uint64("epoch", epoch))
+ log := s.log.With(zap.Uint64("epoch", epoch)).WithTag(logger.TagGC)
log.Debug(ctx, logs.ShardStartedExpiredTombstonesHandling)
defer log.Debug(ctx, logs.ShardFinishedExpiredTombstonesHandling)
diff --git a/pkg/local_object_storage/shard/shard.go b/pkg/local_object_storage/shard/shard.go
index b9ec05f01..665af6edc 100644
--- a/pkg/local_object_storage/shard/shard.go
+++ b/pkg/local_object_storage/shard/shard.go
@@ -204,8 +204,8 @@ func WithPiloramaOptions(opts ...pilorama.Option) Option {
// WithLogger returns option to set Shard's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l
- c.gcCfg.log = l
+ c.log = l.WithTag(logger.TagShard)
+ c.gcCfg.log = l.WithTag(logger.TagGC)
}
}
diff --git a/pkg/local_object_storage/writecache/options.go b/pkg/local_object_storage/writecache/options.go
index dbbe66c19..e393bb25f 100644
--- a/pkg/local_object_storage/writecache/options.go
+++ b/pkg/local_object_storage/writecache/options.go
@@ -5,7 +5,6 @@ import (
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/qos"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
- "go.uber.org/zap"
)
// Option represents write-cache configuration option.
@@ -46,7 +45,7 @@ type options struct {
// WithLogger sets logger.
func WithLogger(log *logger.Logger) Option {
return func(o *options) {
- o.log = log.With(zap.String("component", "WriteCache"))
+ o.log = log.WithTag(logger.TagWriteCache)
}
}
diff --git a/pkg/services/object/delete/service.go b/pkg/services/object/delete/service.go
index 867d3f4ef..008264c0a 100644
--- a/pkg/services/object/delete/service.go
+++ b/pkg/services/object/delete/service.go
@@ -92,6 +92,6 @@ func New(gs *getsvc.Service,
// WithLogger returns option to specify Delete service's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l.With(zap.String("component", "objectSDK.Delete service"))
+ c.log = l.WithTag(logger.TagDeleteSvc)
}
}
diff --git a/pkg/services/object/get/service.go b/pkg/services/object/get/service.go
index 9ec10b5f2..972479aff 100644
--- a/pkg/services/object/get/service.go
+++ b/pkg/services/object/get/service.go
@@ -53,6 +53,6 @@ func New(
// WithLogger returns option to specify Get service's logger.
func WithLogger(l *logger.Logger) Option {
return func(s *Service) {
- s.log = l.With(zap.String("component", "Object.Get service"))
+ s.log = l.WithTag(logger.TagGetSvc)
}
}
diff --git a/pkg/services/object/get/v2/service.go b/pkg/services/object/get/v2/service.go
index fc483b74b..43104703f 100644
--- a/pkg/services/object/get/v2/service.go
+++ b/pkg/services/object/get/v2/service.go
@@ -145,6 +145,6 @@ func (s *Service) Head(ctx context.Context, req *objectV2.HeadRequest) (*objectV
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l.With(zap.String("component", "Object.Get V2 service"))
+ c.log = l.WithTag(logger.TagGetSvc)
}
}
diff --git a/pkg/services/object/search/service.go b/pkg/services/object/search/service.go
index e1aeca957..ac6e20bd2 100644
--- a/pkg/services/object/search/service.go
+++ b/pkg/services/object/search/service.go
@@ -94,6 +94,6 @@ func New(e *engine.StorageEngine,
// WithLogger returns option to specify Get service's logger.
func WithLogger(l *logger.Logger) Option {
return func(c *cfg) {
- c.log = l.With(zap.String("component", "Object.Search service"))
+ c.log = l.WithTag(logger.TagSearchSvc)
}
}
diff --git a/pkg/services/policer/policer.go b/pkg/services/policer/policer.go
index 4e8bacfec..a8db97a7d 100644
--- a/pkg/services/policer/policer.go
+++ b/pkg/services/policer/policer.go
@@ -4,9 +4,9 @@ import (
"sync"
"time"
+ "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
lru "github.com/hashicorp/golang-lru/v2"
- "go.uber.org/zap"
)
type objectsInWork struct {
@@ -54,7 +54,7 @@ func New(opts ...Option) *Policer {
opts[i](c)
}
- c.log = c.log.With(zap.String("component", "Object Policer"))
+ c.log = c.log.WithTag(logger.TagPolicer)
cache, err := lru.New[oid.Address, time.Time](int(c.cacheSize))
if err != nil {
diff --git a/pkg/services/replicator/replicator.go b/pkg/services/replicator/replicator.go
index 6910fa5af..14311726c 100644
--- a/pkg/services/replicator/replicator.go
+++ b/pkg/services/replicator/replicator.go
@@ -7,7 +7,6 @@ import (
objectwriter "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/common/writer"
getsvc "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/get"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger"
- "go.uber.org/zap"
)
// Replicator represents the utility that replicates
@@ -45,7 +44,7 @@ func New(opts ...Option) *Replicator {
opts[i](c)
}
- c.log = c.log.With(zap.String("component", "Object Replicator"))
+ c.log = c.log.WithTag(logger.TagReplicator)
return &Replicator{
cfg: c,
diff --git a/pkg/services/session/executor.go b/pkg/services/session/executor.go
index 12b221613..f0591de71 100644
--- a/pkg/services/session/executor.go
+++ b/pkg/services/session/executor.go
@@ -33,10 +33,7 @@ func NewExecutionService(exec ServiceExecutor, respSvc *response.Service, l *log
}
func (s *executorSvc) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) {
- s.log.Debug(ctx, logs.ServingRequest,
- zap.String("component", "SessionService"),
- zap.String("request", "Create"),
- )
+ s.log.Debug(ctx, logs.ServingRequest, zap.String("request", "Create"))
respBody, err := s.exec.Create(ctx, req.GetBody())
if err != nil {
diff --git a/pkg/util/logger/tags.go b/pkg/util/logger/tags.go
index f11c68d75..84eab085d 100644
--- a/pkg/util/logger/tags.go
+++ b/pkg/util/logger/tags.go
@@ -16,12 +16,40 @@ const (
TagGrpcSvc
TagIr
TagProcessor
+ TagEngine
+ TagBlobovnicza
+ TagBlobstor
+ TagFSTree
+ TagGC
+ TagShard
+ TagWriteCache
+ TagDeleteSvc
+ TagGetSvc
+ TagSearchSvc
+ TagSessionSvc
+ TagTreeSvc
+ TagPolicer
+ TagReplicator
- tagMain = "main"
- tagMorph = "morph"
- tagGrpcSvc = "grpc_svc"
- tagIr = "ir"
- tagProcessor = "processor"
+ tagMain = "main"
+ tagMorph = "morph"
+ tagGrpcSvc = "grpc_svc"
+ tagIr = "ir"
+ tagProcessor = "processor"
+ tagEngine = "engine"
+ tagBlobovnicza = "blobovnicza"
+ tagBlobstor = "blobstor"
+ tagFSTree = "fstree"
+ tagGC = "gc"
+ tagShard = "shard"
+ tagWriteCache = "writecache"
+ tagDeleteSvc = "deletesvc"
+ tagGetSvc = "getsvc"
+ tagSearchSvc = "searchsvc"
+ tagSessionSvc = "sessionsvc"
+ tagTreeSvc = "treesvc"
+ tagPolicer = "policer"
+ tagReplicator = "replicator"
)
// tagToMask return bit mask for the tag, encoded in uint32.
@@ -37,6 +65,34 @@ func tagFromString(str string) (Tag, error) {
return TagIr, nil
case tagProcessor:
return TagProcessor, nil
+ case tagEngine:
+ return TagEngine, nil
+ case tagBlobovnicza:
+ return TagBlobovnicza, nil
+ case tagBlobstor:
+ return TagBlobstor, nil
+ case tagFSTree:
+ return TagFSTree, nil
+ case tagGC:
+ return TagGC, nil
+ case tagShard:
+ return TagShard, nil
+ case tagWriteCache:
+ return TagWriteCache, nil
+ case tagDeleteSvc:
+ return TagDeleteSvc, nil
+ case tagGetSvc:
+ return TagGetSvc, nil
+ case tagSearchSvc:
+ return TagSearchSvc, nil
+ case tagSessionSvc:
+ return TagSessionSvc, nil
+ case tagTreeSvc:
+ return TagTreeSvc, nil
+ case tagPolicer:
+ return TagPolicer, nil
+ case tagReplicator:
+ return TagReplicator, nil
default:
return math.MaxUint8, fmt.Errorf("unsupported tag %s", str)
}
@@ -55,6 +111,34 @@ func tagToString(tag Tag) string {
return tagIr
case TagProcessor:
return tagProcessor
+ case TagEngine:
+ return tagEngine
+ case TagBlobovnicza:
+ return tagBlobovnicza
+ case TagBlobstor:
+ return tagBlobstor
+ case TagFSTree:
+ return tagFSTree
+ case TagGC:
+ return tagGC
+ case TagShard:
+ return tagShard
+ case TagWriteCache:
+ return tagWriteCache
+ case TagDeleteSvc:
+ return tagDeleteSvc
+ case TagGetSvc:
+ return tagGetSvc
+ case TagSearchSvc:
+ return tagSearchSvc
+ case TagSessionSvc:
+ return tagSessionSvc
+ case TagTreeSvc:
+ return tagTreeSvc
+ case TagPolicer:
+ return tagPolicer
+ case TagReplicator:
+ return tagReplicator
default:
return ""
}