diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 7f3ae8bb..370c0eb0 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -11,6 +11,7 @@ true <_SkipUpgradeNetAnalyzersNuGetWarning>true true + en;en-US 4.5.0 diff --git a/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs b/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs index 9725c8eb..313c4eb5 100644 --- a/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs +++ b/src/log4net.Tests/Integration/Log4NetIntegrationTests.cs @@ -23,8 +23,12 @@ using System.Linq; using log4net.Appender; using log4net.Config; +using log4net.Core; +using log4net.Layout; using log4net.Repository; +using log4net.Repository.Hierarchy; using NUnit.Framework; +using LoggerHierarchy = log4net.Repository.Hierarchy.Hierarchy; namespace log4net.Tests.Integration { @@ -172,17 +176,24 @@ public void Log4Net_WritesLogFile_WithMaxSizeRoll_Config_Works() public void Log4Net_WritesLogFile_WithDateAndSizeRoll_Config_Works() { DirectoryInfo logDir = CreateLogDirectory("integrationTestLogDir_maxsizerolldate"); - (ILog log, ILoggerRepository repo) = ArrangeLogger("log4net.maxsizeroll_date.config"); - MockDateTime mockDateTime = new(); - repo.GetAppenders().OfType().First().DateTimeStrategy = mockDateTime; - // Write enough lines to trigger rolling by size and date - for (int i = 1; i < 10000; ++i) + DateTime startDate = new(2025, 12, 08, 15, 55, 50); + MockDateTime mockDateTime = new(startDate); // start at the end of a minute + (ILog log, ILoggerRepository repo) = ArrangeCompositeLogger(mockDateTime); + // distribute 10.000 log entries over 60 seconds + TimeSpan stepIncrement = new(TimeSpan.FromSeconds(60).Ticks / 10000); + // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4 will survive + for (int i = 1; i < 1000; ++i) { - log.Debug($"DateRoll entry {i}"); - if (i % 5000 == 0) - { - mockDateTime.Offset = TimeSpan.FromMinutes(1); // allow time for date to change if needed - } + log.Debug($"DateRoll entry {i:D5}"); + mockDateTime.Now += stepIncrement; + } + // switch to next minute to force date roll + mockDateTime.Now = startDate.AddSeconds(10); + // 1000 entries (each 100 bytes) -> ~100KB total - 10 rolls expected - 4 will survive + for (int i = 1; i < 1000; ++i) + { + log.Debug($"DateRoll entry {i:D5}"); + mockDateTime.Now += stepIncrement; } repo.Shutdown(); // Assert: rolled files exist (date+size pattern) @@ -270,5 +281,36 @@ private static (ILog log, ILoggerRepository repo) ArrangeLogger(string configFil ILog log = LogManager.GetLogger(repo.Name, "IntegrationTestLogger"); return (log, repo); } + + private static (ILog log, ILoggerRepository repo) ArrangeCompositeLogger(RollingFileAppender.IDateTime dateTime) + { + LoggerHierarchy repo = (LoggerHierarchy)LogManager.CreateRepository(Guid.NewGuid().ToString()); + PatternLayout layout = new() { ConversionPattern = "%d{yyyy/MM/dd HH:mm:ss.fff} %m-%M%n" }; + layout.ActivateOptions(); + RollingFileAppender rollingAppender = new() + { + Name = "LogFileAppender", + File = "integrationTestLogDir_maxsizerolldate/.log", + AppendToFile = true, + RollingStyle = RollingFileAppender.RollingMode.Composite, + DatePattern = "HH-mm", + DateTimeStrategy = dateTime, + MaximumFileSize = "10KB", + MaxSizeRollBackups = 3, + StaticLogFileName = false, + CountDirection = 1, + PreserveLogFileNameExtension = true, + LockingModel = new FileAppender.NoLock(), + Layout = layout + }; + rollingAppender.ActivateOptions(); + repo.Configured = true; + Logger logger = (Logger)repo.GetLogger("IntegrationTestLogger"); + logger.Level = Level.Debug; + logger.AddAppender(rollingAppender); + logger.Additivity = false; + return (log: new LogImpl(logger), repo); + } + } } \ No newline at end of file diff --git a/src/log4net.Tests/Integration/MockDateTime.cs b/src/log4net.Tests/Integration/MockDateTime.cs index efa67d7a..f0bd6317 100644 --- a/src/log4net.Tests/Integration/MockDateTime.cs +++ b/src/log4net.Tests/Integration/MockDateTime.cs @@ -25,13 +25,8 @@ namespace log4net.Tests.Integration; /// /// Mock implementation of /// -internal sealed class MockDateTime : RollingFileAppender.IDateTime +internal sealed class MockDateTime(DateTime now) : RollingFileAppender.IDateTime { - /// - /// Offset to apply to the current time. - /// - internal TimeSpan Offset { get; set; } - /// - public DateTime Now => DateTime.Now + Offset; + public DateTime Now { get; set; } = now; } \ No newline at end of file diff --git a/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config b/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config deleted file mode 100644 index 2ea6bf4c..00000000 --- a/src/log4net.Tests/Integration/log4net.maxsizeroll_date.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 4a1895ed..368fd27e 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -35,22 +35,7 @@ - - Always - - - Always - - - Always - - - Always - - - Always - - + Always