Skip to content

Commit 3ec77ea

Browse files
authored
Dynamic logging (#5119)
* dynamic log level change * sensuctl command addition * Mockclient changes * loglevel cli command test cases * static check fix * fixing merge conflict --------- Signed-off-by: Rajshekar Chavakula <ch.rajshekar@gmail.com>
1 parent 6832f25 commit 3ec77ea

61 files changed

Lines changed: 2277 additions & 94 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

backend/agentd/logger.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package agentd
22

33
import (
44
"bytes"
5+
"github.com/sensu/sensu-go/util/logging"
56

67
"github.com/sirupsen/logrus"
78
)
89

9-
var logger = logrus.WithFields(logrus.Fields{
10+
var logger = logging.GetLogger("agentd").WithFields(logrus.Fields{
1011
"component": "agentd",
1112
})
1213

backend/api/logger.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package api
22

33
import (
4+
"github.com/sensu/sensu-go/util/logging"
45
"github.com/sirupsen/logrus"
56
)
67

7-
var logger = logrus.WithFields(logrus.Fields{
8+
var logger = logging.GetLogger("backend.api").WithFields(logrus.Fields{
89
"component": "backend.api",
910
})
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package actions
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/sensu/sensu-go/util/logging"
9+
)
10+
11+
// LogLevelChangeController exposes actions to change log levels dynamically.
12+
type LogLevelChangeController struct{}
13+
14+
// NewLogLevelChangeController returns a new LogLevelChangeController
15+
func NewLogLevelChangeController() LogLevelChangeController {
16+
return LogLevelChangeController{}
17+
}
18+
19+
// SetGlobalModuleLogLevel exposes action to change log level for all modules
20+
func (a LogLevelChangeController) SetGlobalModuleLogLevel(ctx context.Context, logLevel string) ([]*logging.LogHistory, error) {
21+
// Get current levels atomically
22+
existingLog := logging.GetModuleLogLevels()
23+
var logChanges []*logging.LogHistory
24+
var errLog []error
25+
26+
logger.Debug("Setting global log level to: ", logLevel)
27+
28+
for _, logLevelArr := range existingLog {
29+
// Actually change the log level
30+
err := logging.SetLogLevel(logLevelArr.Module, logLevel)
31+
if err != nil {
32+
errLog = append(errLog, fmt.Errorf("failed to set level for module %s: %w", logLevelArr.Module, err))
33+
continue
34+
}
35+
36+
if logLevelArr.Module == "etcd" {
37+
if err := logging.SetEtcdLogLevel(logLevel); err != nil {
38+
errLog = append(errLog, fmt.Errorf("failed to set level for module %s: %w", logLevelArr.Module, err))
39+
continue
40+
}
41+
}
42+
43+
change := &logging.LogHistory{
44+
Module: logLevelArr.Module,
45+
OldLevel: logLevelArr.Level,
46+
NewLevel: logLevel,
47+
}
48+
logChanges = append(logChanges, change)
49+
}
50+
51+
// Return error if any module failed
52+
if len(errLog) > 0 {
53+
return logChanges, fmt.Errorf("some modules failed to update: %v", errLog)
54+
}
55+
56+
return logChanges, nil
57+
}
58+
59+
// Create set log level for multiple modules.
60+
func (a LogLevelChangeController) Create(ctx context.Context, requests []logging.LogLevelRequest) ([]logging.LogHistory, error) {
61+
var results []logging.LogHistory
62+
for _, req := range requests {
63+
oldLevel := logging.GetModuleLogLevel(req.Module)
64+
err := logging.SetLogLevel(req.Module, req.Level)
65+
change := logging.LogHistory{
66+
Module: req.Module,
67+
}
68+
69+
if err != nil {
70+
change.Error = err.Error()
71+
results = append(results, change)
72+
} else {
73+
74+
// if Module is etcd, initialize zap logger
75+
if req.Module == "etcd" {
76+
if err := logging.SetEtcdLogLevel(req.Level); err != nil {
77+
change.Error = err.Error()
78+
}
79+
}
80+
81+
change.NewLevel = req.Level
82+
change.OldLevel = oldLevel
83+
results = append(results, change)
84+
}
85+
}
86+
return results, nil
87+
}
88+
89+
// List will give Module and corresponding log level
90+
func (a LogLevelChangeController) List(ctx context.Context) ([]logging.LogLevelRequest, error) {
91+
existingLog := logging.GetModuleLogLevels()
92+
if len(existingLog) == 0 {
93+
return []logging.LogLevelRequest{}, errors.New("no module log levels found")
94+
}
95+
return existingLog, nil
96+
}
97+
98+
func (a LogLevelChangeController) ModuleLogLevel(ctx context.Context, module string) (*logging.LogLevelRequest, error) {
99+
existingLog := logging.GetModuleLogLevel(module)
100+
if existingLog == "" {
101+
return nil, errors.New("no module log levels found")
102+
}
103+
logLevel := &logging.LogLevelRequest{
104+
Module: module,
105+
Level: existingLog,
106+
}
107+
return logLevel, nil
108+
}

0 commit comments

Comments
 (0)