2323using System . Linq ;
2424using log4net . Appender ;
2525using log4net . Config ;
26+ using log4net . Core ;
27+ using log4net . Layout ;
2628using log4net . Repository ;
29+ using log4net . Repository . Hierarchy ;
2730using NUnit . Framework ;
31+ using LoggerHierarchy = log4net . Repository . Hierarchy . Hierarchy ;
2832
2933namespace log4net . Tests . Integration
3034{
@@ -172,17 +176,24 @@ public void Log4Net_WritesLogFile_WithMaxSizeRoll_Config_Works()
172176 public void Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works ( )
173177 {
174178 DirectoryInfo logDir = CreateLogDirectory ( "integrationTestLogDir_maxsizerolldate" ) ;
175- ( ILog log , ILoggerRepository repo ) = ArrangeLogger ( "log4net.maxsizeroll_date.config" ) ;
176- MockDateTime mockDateTime = new ( ) ;
177- repo . GetAppenders ( ) . OfType < RollingFileAppender > ( ) . First ( ) . DateTimeStrategy = mockDateTime ;
178- // Write enough lines to trigger rolling by size and date
179- for ( int i = 1 ; i < 10000 ; ++ i )
179+ DateTime startDate = new ( 2025 , 12 , 08 , 15 , 55 , 50 ) ;
180+ MockDateTime mockDateTime = new ( startDate ) ; // start at the end of a minute
181+ ( ILog log , ILoggerRepository repo ) = ArrangeCompositeLogger ( mockDateTime ) ;
182+ // distribute 10.000 log entries over 60 seconds
183+ TimeSpan stepIncrement = new ( TimeSpan . FromSeconds ( 60 ) . Ticks / 10000 ) ;
184+ // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4 will survive
185+ for ( int i = 1 ; i < 1000 ; ++ i )
180186 {
181- log . Debug ( $ "DateRoll entry { i } ") ;
182- if ( i % 5000 == 0 )
183- {
184- mockDateTime . Offset = TimeSpan . FromMinutes ( 1 ) ; // allow time for date to change if needed
185- }
187+ log . Debug ( $ "DateRoll entry { i : D5} ") ;
188+ mockDateTime . Now += stepIncrement ;
189+ }
190+ // switch to next minute to force date roll
191+ mockDateTime . Now = startDate . AddSeconds ( 10 ) ;
192+ // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4 will survive
193+ for ( int i = 1 ; i < 1000 ; ++ i )
194+ {
195+ log . Debug ( $ "DateRoll entry { i : D5} ") ;
196+ mockDateTime . Now += stepIncrement ;
186197 }
187198 repo . Shutdown ( ) ;
188199 // Assert: rolled files exist (date+size pattern)
@@ -270,5 +281,36 @@ private static (ILog log, ILoggerRepository repo) ArrangeLogger(string configFil
270281 ILog log = LogManager . GetLogger ( repo . Name , "IntegrationTestLogger" ) ;
271282 return ( log , repo ) ;
272283 }
284+
285+ private static ( ILog log , ILoggerRepository repo ) ArrangeCompositeLogger ( RollingFileAppender . IDateTime dateTime )
286+ {
287+ LoggerHierarchy repo = ( LoggerHierarchy ) LogManager . CreateRepository ( Guid . NewGuid ( ) . ToString ( ) ) ;
288+ PatternLayout layout = new ( ) { ConversionPattern = "%d{yyyy/MM/dd HH:mm:ss.fff} %m-%M%n" } ;
289+ layout . ActivateOptions ( ) ;
290+ RollingFileAppender rollingAppender = new ( )
291+ {
292+ Name = "LogFileAppender" ,
293+ File = "integrationTestLogDir_maxsizerolldate/.log" ,
294+ AppendToFile = true ,
295+ RollingStyle = RollingFileAppender . RollingMode . Composite ,
296+ DatePattern = "HH-mm" ,
297+ DateTimeStrategy = dateTime ,
298+ MaximumFileSize = "10KB" ,
299+ MaxSizeRollBackups = 3 ,
300+ StaticLogFileName = false ,
301+ CountDirection = 1 ,
302+ PreserveLogFileNameExtension = true ,
303+ LockingModel = new FileAppender . NoLock ( ) ,
304+ Layout = layout
305+ } ;
306+ rollingAppender . ActivateOptions ( ) ;
307+ repo . Configured = true ;
308+ Logger logger = ( Logger ) repo . GetLogger ( "IntegrationTestLogger" ) ;
309+ logger . Level = Level . Debug ;
310+ logger . AddAppender ( rollingAppender ) ;
311+ logger . Additivity = false ;
312+ return ( log : new LogImpl ( logger ) , repo ) ;
313+ }
314+
273315 }
274316}
0 commit comments