1717package log
1818
1919import (
20+ "sort"
2021 "sync/atomic"
2122
2223 "github.com/go-spring/spring-base/util"
@@ -124,6 +125,23 @@ type AppenderRefs struct {
124125 AppenderRefs []* AppenderRef `PluginElement:"AppenderRef"`
125126}
126127
128+ // sortByLevel sorts appender references by level.
129+ func (c * AppenderRefs ) sortByLevel () {
130+
131+ // Sort appender references by level
132+ sort .Slice (c .AppenderRefs , func (i , j int ) bool {
133+ iCode := c .AppenderRefs [i ].Level .MinLevel .code
134+ jCode := c .AppenderRefs [j ].Level .MinLevel .code
135+ return iCode < jCode
136+ })
137+
138+ for i := len (c .AppenderRefs ) - 1 ; i >= 1 ; i -- {
139+ if c .AppenderRefs [i - 1 ].Level .MaxLevel == MaxLevel {
140+ c .AppenderRefs [i - 1 ].Level .MaxLevel = c .AppenderRefs [i ].Level .MinLevel
141+ }
142+ }
143+ }
144+
127145// Append forwards events to each child appender.
128146func (c * AppenderRefs ) sendToAppenders (e * Event ) {
129147 for _ , r := range c .AppenderRefs {
@@ -148,8 +166,10 @@ type SyncLogger struct {
148166 AppenderRefs
149167}
150168
151- func (c * SyncLogger ) Start () error { return nil }
152- func (c * SyncLogger ) Stop () {}
169+ func (c * SyncLogger ) Start () error {
170+ c .AppenderRefs .sortByLevel ()
171+ return nil
172+ }
153173
154174// Append sends the event directly to appenders (blocking).
155175func (c * SyncLogger ) Append (e * Event ) {
@@ -169,6 +189,8 @@ func (c *SyncLogger) Write(b []byte) {
169189 c .writeToAppenders (MaxLevel , b )
170190}
171191
192+ func (c * SyncLogger ) Stop () {}
193+
172194// BufferFullPolicy specifies what to do when an async buffer is full.
173195type BufferFullPolicy int
174196
@@ -218,10 +240,13 @@ func (c *AsyncLogger) Start() error {
218240 if c .BufferSize < 100 {
219241 return util .FormatError (nil , "bufferSize is too small" )
220242 }
243+
221244 c .buf = make (chan any , c .BufferSize )
222245 c .wait = make (chan struct {})
223246 c .stop = & Event {}
224247
248+ c .AppenderRefs .sortByLevel ()
249+
225250 // Worker goroutine to process buffered items
226251 go func () {
227252 for v := range c .buf {
0 commit comments