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