@@ -42,8 +42,8 @@ type Logger interface {
4242 GetLevel () LevelRange
4343}
4444
45- // AppenderRef represents a reference to an appender by name.
46- // The actual Appender is resolved and injected later during configuration.
45+ // AppenderRef represents a reference to an Appender by name.
46+ // The actual Appender is resolved and injected during configuration.
4747type AppenderRef struct {
4848 Appender
4949 Ref string `PluginAttribute:"ref"`
@@ -64,10 +64,10 @@ func (c *AppenderRef) Write(b []byte) {
6464
6565// LoggerBase contains fields shared by all logger configurations.
6666type LoggerBase struct {
67- Name string `PluginAttribute:"name"` // Logger name
68- Tags string `PluginAttribute:"tags,default="` // Optional tags
69- Level LevelRange `PluginAttribute:"level,default="`
70- Layout Layout `PluginElement:"Layout?"`
67+ Name string `PluginAttribute:"name"` // Logger name
68+ Tags string `PluginAttribute:"tags,default="` // Optional tags
69+ Level LevelRange `PluginAttribute:"level,default="` // Logger level range
70+ Layout Layout `PluginElement:"Layout?"` // Layout for formatting logs
7171}
7272
7373// GetName returns the name of the logger.
@@ -94,48 +94,55 @@ var (
9494 _ Logger = (* RollingFileLogger )(nil )
9595)
9696
97+ // DiscardLogger ignores all log events (no-op).
9798type DiscardLogger struct {
9899 LoggerBase
99100 DiscardAppender
100101}
101102
103+ // ConsoleLogger writes log events to standard output.
102104type ConsoleLogger struct {
103105 LoggerBase
104106 ConsoleAppender
105107}
106108
109+ // Append sends the event to the console if the level is enabled.
107110func (c * ConsoleLogger ) Append (e * Event ) {
108111 if c .Level .Enable (e .Level ) {
109112 c .ConsoleAppender .Append (e )
110113 }
111114}
112115
116+ // FileLogger writes log events to a file.
113117type FileLogger struct {
114118 LoggerBase
115119 FileAppender
116120}
117121
122+ // Append writes the event to the file if the level is enabled.
118123func (c * FileLogger ) Append (e * Event ) {
119124 if c .Level .Enable (e .Level ) {
120125 c .FileAppender .Append (e )
121126 }
122127}
123128
124- // AppenderRefs represents a group of appenders .
129+ // AppenderRefs represents a collection of AppenderRef objects .
125130type AppenderRefs struct {
126131 AppenderRefs []* AppenderRef `PluginElement:"AppenderRef"`
127132}
128133
129- // sortByLevel sorts appender references by level.
134+ // sortByLevel sorts appender references by minimum level,
135+ // and adjusts MaxLevel for chained ranges.
130136func (c * AppenderRefs ) sortByLevel () {
131137
132- // Sort appender references by level
138+ // Sort appender references by MinLevel
133139 sort .Slice (c .AppenderRefs , func (i , j int ) bool {
134140 iCode := c .AppenderRefs [i ].Level .MinLevel .code
135141 jCode := c .AppenderRefs [j ].Level .MinLevel .code
136142 return iCode < jCode
137143 })
138144
145+ // Adjust MaxLevel to match the next appender's MinLevel if needed
139146 for i := len (c .AppenderRefs ) - 1 ; i >= 1 ; i -- {
140147 if c .AppenderRefs [i - 1 ].Level .MaxLevel == MaxLevel {
141148 c .AppenderRefs [i - 1 ].Level .MaxLevel = c .AppenderRefs [i ].Level .MinLevel
@@ -232,7 +239,7 @@ func (c *AsyncLogger) GetDiscardCounter() int64 {
232239 return atomic .LoadInt64 (& c .discardCounter )
233240}
234241
235- // Start initializes channels and launches the worker goroutine.
242+ // Start initializes the AsyncLogger and launches the worker goroutine.
236243func (c * AsyncLogger ) Start () error {
237244 if c .BufferSize < 100 {
238245 return util .FormatError (nil , "bufferSize is too small" )
@@ -315,10 +322,8 @@ func (c *AsyncLogger) onBufferFull(v any) {
315322 }
316323 }
317324 case BufferFullPolicyBlock :
318- // Block until space is available
319- c .buf <- v
325+ c .buf <- v // Block until space is available
320326 case BufferFullPolicyDiscard :
321- // Discard new item
322327 atomic .AddInt64 (& c .discardCounter , 1 )
323328 if e , ok := v .(* Event ); ok {
324329 PutEvent (e )
@@ -329,17 +334,13 @@ func (c *AsyncLogger) onBufferFull(v any) {
329334}
330335
331336// Stop gracefully shuts down the async logger.
332- // It signals the worker goroutine to exit and waits for it.
333- // NOTE: Stop must be called only once, otherwise panic may occur.
334337func (c * AsyncLogger ) Stop () {
335338 c .buf <- c .stop
336339 <- c .wait
337340 close (c .buf )
338341}
339342
340- // RollingFileLogger is a logger implementation that writes log events to files.
341- // It can work in either synchronous or asynchronous mode depending on AsyncWrite.
342- // It also supports splitting warning/error logs into a separate file.
343+ // RollingFileLogger writes log events to files with optional rotation, separation, and async behavior.
343344type RollingFileLogger struct {
344345 LoggerBase
345346 logger Logger
@@ -352,21 +353,19 @@ type RollingFileLogger struct {
352353 // If true, warning/error logs go to a separate .wf file.
353354 Separate bool `PluginAttribute:"separate,default=false"`
354355
355- // rotation and cleanup configuration
356+ // Rotation and retention
356357 Rotation TimeRotation `PluginAttribute:"rotation"`
357358 MaxAge int32 `PluginAttribute:"maxAge,default=168"`
358359
359- // asynchronous logging configuration
360+ // Async logging options
360361 AsyncWrite bool `PluginAttribute:"async,default=false"`
361362 BufferSize int `PluginAttribute:"bufferSize,default=10000"`
362363 BufferFullPolicy BufferFullPolicy `PluginAttribute:"bufferFullPolicy,default=Discard"`
363364}
364365
365- // Start initializes the FileLogger according to AsyncWrite flag
366- // and then starts the underlying logger and its appenders.
366+ // Start initializes the RollingFileLogger, either synchronous or asynchronous.
367367func (f * RollingFileLogger ) Start () error {
368368 if f .AsyncWrite {
369- // Async mode: use AsyncLogger and AsyncRotateFileWriter
370369 return initRollingFileLogger (f , func (f * RollingFileLogger ) Logger {
371370 return & AsyncLogger {
372371 LoggerBase : f .LoggerBase ,
@@ -375,7 +374,6 @@ func (f *RollingFileLogger) Start() error {
375374 }
376375 })
377376 } else {
378- // Sync mode: use SyncLogger and SyncRotateFileWriter
379377 return initRollingFileLogger (f , func (f * RollingFileLogger ) Logger {
380378 return & SyncLogger {
381379 LoggerBase : f .LoggerBase ,
@@ -384,9 +382,7 @@ func (f *RollingFileLogger) Start() error {
384382 }
385383}
386384
387- // initRollingFileLogger is a generic helper to configure both synchronous and asynchronous FileLogger.
388- // - fnAppender creates either SyncRotateFileWriter or AsyncRotateFileWriter.
389- // - fnLogger creates either SyncLogger or AsyncLogger.
385+ // initRollingFileLogger is a helper to configure appenders for RollingFileLogger.
390386func initRollingFileLogger (
391387 f * RollingFileLogger ,
392388 fnLogger func (f * RollingFileLogger ) Logger ,
@@ -451,14 +447,17 @@ func initRollingFileLogger(
451447 return nil
452448}
453449
450+ // Append forwards the event to the underlying logger.
454451func (f * RollingFileLogger ) Append (e * Event ) {
455452 f .logger .Append (e )
456453}
457454
455+ // Write forwards raw bytes to the underlying logger.
458456func (f * RollingFileLogger ) Write (b []byte ) {
459457 f .logger .Write (b )
460458}
461459
460+ // Stop stops all appenders.
462461func (f * RollingFileLogger ) Stop () {
463462 for _ , a := range f .appenders {
464463 a .Stop ()
0 commit comments