@@ -67,18 +67,22 @@ var logInfoMap = map[SeverityName]*logInfo{
6767 FatalSeverity : {fileName : defaultFatalLogFileName , metricsName : metricsNameNumDroppedFatalLogs },
6868}
6969
70- type AsyncLogger struct {
70+ type CustomLogger struct {
7171 diodeWriters []diode.Writer
7272}
7373
74- // NewAsyncLogger creates an async logger that produces an async writer for each of the severity levels.
75- // The async writer spins up a goroutine that periodically flushes the buffered logs to disk.
76- func NewAsyncLogger (
74+ // NewCustomLogger creates a custom logger that can either be asynchronous or synchronous, depending on configuration.
75+ func NewCustomLogger (
7776 agentCtx * agent.GenericContext , logDir string , maxSizeMB , maxAge , maxBackups , bufferSize int ,
78- ) * AsyncLogger {
77+ ) * CustomLogger {
7978 wrappedEmitter := agentCtx .EmitterPool .GetDefaultMetricsEmitter ()
8079
81- asyncLogger := & AsyncLogger {}
80+ // If logDir is not set, we are still using klog's native logger, so we just return an empty logger without calling SetOutput()
81+ if logDir == "" {
82+ return & CustomLogger {}
83+ }
84+
85+ customLogger := & CustomLogger {}
8286 for severity , logInfo := range logInfoMap {
8387 // lumberjackLogger is a logger that rotates log files
8488 lumberjackLogger := & lumberjack.Logger {
@@ -88,19 +92,26 @@ func NewAsyncLogger(
8892 MaxBackups : maxBackups ,
8993 }
9094
91- // diodeWriter is a writer that stores logs in a ring buffer and asynchronously flushes them
92- diodeWriter := diode .NewWriter (lumberjackLogger , bufferSize , 10 * time .Millisecond , func (missed int ) {
93- _ = wrappedEmitter .StoreInt64 (logInfo .metricsName , int64 (missed ), metrics .MetricTypeNameRaw )
94- })
95- // Overrides the default synchronous writer with the diode writer
96- klog .SetOutputBySeverity (string (severity ), diodeWriter )
97- asyncLogger .diodeWriters = append (asyncLogger .diodeWriters , diodeWriter )
95+ // Enable async logger if buffer size is more than 0; otherwise, use synchronous lumberjack logger
96+ if bufferSize > 0 {
97+ // diodeWriter is a writer that stores logs in a ring buffer and asynchronously flushes them to disk
98+ diodeWriter := diode .NewWriter (lumberjackLogger , bufferSize , 10 * time .Millisecond , func (missed int ) {
99+ _ = wrappedEmitter .StoreInt64 (logInfo .metricsName , int64 (missed ), metrics .MetricTypeNameRaw )
100+ })
101+ // Overrides the default synchronous writer with the diode writer
102+ klog .SetOutputBySeverity (string (severity ), diodeWriter )
103+ customLogger .diodeWriters = append (customLogger .diodeWriters , diodeWriter )
104+ klog .Infof ("custom async logger is enabled for the severity %s" , severity )
105+ } else {
106+ klog .SetOutputBySeverity (string (severity ), lumberjackLogger )
107+ klog .Infof ("custom sync logger is enabled for the severity %s" , severity )
108+ }
98109 }
99110
100- return asyncLogger
111+ return customLogger
101112}
102113
103- func (a * AsyncLogger ) Shutdown () {
114+ func (a * CustomLogger ) Shutdown () {
104115 klog .Info ("[Shutdown] async writer is shutting down..." )
105116 klog .Flush ()
106117 for _ , writer := range a .diodeWriters {
0 commit comments