This is an automated email from the ASF dual-hosted git repository. freeandnil pushed a commit to branch Feature/118-nullability in repository https://gitbox.apache.org/repos/asf/logging-log4net.git
commit 1b329f8bc8928052bb13ffc7fd44256d06668f82 Author: Erik Mavrinac <[email protected]> AuthorDate: Fri Mar 8 14:37:54 2024 -0800 Enable nullable for FileAppender, RollingFileAppender and tests, then fix null issues. Also includes adding friend reference for unit tests to remove reflection code across unit tests for type safety, removing ArrayList usage in favor or strongly typed lists, and a few opportunistic auto-properties and other modernizations --- src/Directory.Build.props | 1 + .../log4net-611-lib/log4net-611-lib.csproj | 1 - .../log4net-611-main/log4net-611-main.csproj | 1 - src/log4net.Tests/Appender/EventLogAppenderTest.cs | 26 +- src/log4net.Tests/Appender/RemotingAppenderTest.cs | 13 +- .../Appender/RollingFileAppenderTest.cs | 355 +++++++-------------- .../Util/EnvironmentPatternConverterTest.cs | 22 +- src/log4net.Tests/Util/PatternConverterTest.cs | 2 +- .../Util/RandomStringPatternConverterTest.cs | 28 +- src/log4net.Tests/Utils.cs | 77 +---- src/log4net.Tests/log4net.Tests.csproj | 2 + src/log4net/Appender/EventLogAppender.cs | 2 +- src/log4net/Appender/FileAppender.cs | 284 ++++++++--------- src/log4net/Appender/RollingFileAppender.cs | 343 ++++++++------------ src/log4net/Core/LoggingEvent.cs | 2 +- .../Layout/Pattern/PatternLayoutConverter.cs | 5 +- src/log4net/Util/PatternConverter.cs | 3 +- .../AppDomainPatternConverter.cs | 6 +- .../AppSettingPatternConverter.cs | 2 +- .../DatePatternConverter.cs | 2 +- .../EnvironmentFolderPathPatternConverter.cs | 2 +- .../EnvironmentPatternConverter.cs | 2 +- .../IdentityPatternConverter.cs | 5 +- .../LiteralPatternConverter.cs | 5 +- .../ProcessIdPatternConverter.cs | 2 +- .../PropertyPatternConverter.cs | 2 +- .../RandomStringPatternConverter.cs | 5 +- .../UserNamePatternConverter.cs | 2 +- .../UtcDatePatternConverter.cs | 5 +- src/log4net/log4net.csproj | 1 - 30 files changed, 415 insertions(+), 793 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 41fa9c90..af5d19f6 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,5 +1,6 @@ <Project> <PropertyGroup> <UseSharedCompilation>true</UseSharedCompilation> + <LangVersion>latest</LangVersion> </PropertyGroup> </Project> diff --git a/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj b/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj index 07a87a15..225c91a6 100644 --- a/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj +++ b/src/integration-testing/log4net-611-lib/log4net-611-lib.csproj @@ -5,7 +5,6 @@ <RootNamespace>log4net_611_lib</RootNamespace> <ImplicitUsings>disable</ImplicitUsings> <Nullable>disable</Nullable> - <LangVersion>latest</LangVersion> </PropertyGroup> <ItemGroup> diff --git a/src/integration-testing/log4net-611-main/log4net-611-main.csproj b/src/integration-testing/log4net-611-main/log4net-611-main.csproj index a297564c..644a5226 100644 --- a/src/integration-testing/log4net-611-main/log4net-611-main.csproj +++ b/src/integration-testing/log4net-611-main/log4net-611-main.csproj @@ -6,7 +6,6 @@ <RootNamespace>log4net_611_main</RootNamespace> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> - <LangVersion>latest</LangVersion> </PropertyGroup> <ItemGroup> diff --git a/src/log4net.Tests/Appender/EventLogAppenderTest.cs b/src/log4net.Tests/Appender/EventLogAppenderTest.cs index 14113603..2339ad68 100644 --- a/src/log4net.Tests/Appender/EventLogAppenderTest.cs +++ b/src/log4net.Tests/Appender/EventLogAppenderTest.cs @@ -51,54 +51,44 @@ namespace log4net.Tests.Appender Assert.AreEqual( EventLogEntryType.Information, - GetEntryType(eventAppender, Level.All)); + eventAppender.GetEntryType(Level.All)); Assert.AreEqual( EventLogEntryType.Information, - GetEntryType(eventAppender, Level.Debug)); + eventAppender.GetEntryType(Level.Debug)); Assert.AreEqual( EventLogEntryType.Information, - GetEntryType(eventAppender, Level.Info)); + eventAppender.GetEntryType(Level.Info)); Assert.AreEqual( EventLogEntryType.Warning, - GetEntryType(eventAppender, Level.Warn)); + eventAppender.GetEntryType(Level.Warn)); Assert.AreEqual( EventLogEntryType.Error, - GetEntryType(eventAppender, Level.Error)); + eventAppender.GetEntryType(Level.Error)); Assert.AreEqual( EventLogEntryType.Error, - GetEntryType(eventAppender, Level.Fatal)); + eventAppender.GetEntryType(Level.Fatal)); Assert.AreEqual( EventLogEntryType.Error, - GetEntryType(eventAppender, Level.Off)); + eventAppender.GetEntryType(Level.Off)); } /// <summary> /// ActivateOption tries to create an event source if it doesn't exist but this is going to fail on more modern Windows versions unless the code is run with local administrator privileges. /// </summary> [Test] - [Ignore("seems to require administrator privileges or a specific environent when run")] + [Ignore("seems to require administrator privileges or a specific environment when run")] public void ActivateOptionsDisablesAppenderIfSourceDoesntExist() { EventLogAppender eventAppender = new EventLogAppender(); eventAppender.ActivateOptions(); Assert.AreEqual(Level.Off, eventAppender.Threshold); } - - // - // Helper functions to dig into the appender - // - - private static EventLogEntryType GetEntryType(EventLogAppender appender, Level level) - { - return (EventLogEntryType)Utils.InvokeMethod(appender, "GetEntryType", level); - } - } } diff --git a/src/log4net.Tests/Appender/RemotingAppenderTest.cs b/src/log4net.Tests/Appender/RemotingAppenderTest.cs index 644cd96b..c7d88ba4 100644 --- a/src/log4net.Tests/Appender/RemotingAppenderTest.cs +++ b/src/log4net.Tests/Appender/RemotingAppenderTest.cs @@ -101,7 +101,7 @@ namespace log4net.Tests.Appender Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event"); // Grab the event data - LoggingEventData eventData = GetLoggingEventData(events[0]); + LoggingEventData eventData = events[0].m_data; Assert.IsNull(eventData.LocationInfo, "Expect LocationInfo to be null because only doing a partial fix"); } @@ -131,7 +131,7 @@ namespace log4net.Tests.Appender Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event"); // Grab the event data - LoggingEventData eventData = GetLoggingEventData(events[0]); + LoggingEventData eventData = events[0].m_data; Assert.IsNotNull(eventData.LocationInfo, "Expect LocationInfo to not be null because doing a full fix"); } @@ -377,15 +377,6 @@ namespace log4net.Tests.Appender get { return (LoggingEvent[])m_events.ToArray(typeof(LoggingEvent)); } } } - - // - // Helper functions to dig into the appender - // - - private static LoggingEventData GetLoggingEventData(LoggingEvent loggingEvent) - { - return (LoggingEventData)Utils.GetField(loggingEvent, "m_data"); - } } } diff --git a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs index e470b587..a01fdf96 100644 --- a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs +++ b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs @@ -20,7 +20,7 @@ #endregion using System; -using System.Collections; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; @@ -33,6 +33,8 @@ using log4net.Util; using NUnit.Framework; using System.Globalization; +#nullable enable + namespace log4net.Tests.Appender { /// <summary> @@ -50,17 +52,18 @@ namespace log4net.Tests.Appender "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"; private const int c_iMaximumFileSize = 450; // in bytes - private int _iMessagesLoggedThisFile = 0; - private int _iMessagesLogged = 0; - private int _iCountDirection = 0; + private int _iMessagesLoggedThisFile; + private int _iMessagesLogged; + private int _iCountDirection; private int _MaxSizeRollBackups = 3; - private CountingAppender _caRoot; - private Logger _root; - private CultureInfo _currentCulture; - private CultureInfo _currentUICulture; + private CountingAppender? _caRoot; + private Logger? _root; + private CultureInfo? _currentCulture; + private CultureInfo? _currentUICulture; + private sealed class SilentErrorHandler : IErrorHandler { - private StringBuilder m_buffer = new StringBuilder(); + private readonly StringBuilder m_buffer = new StringBuilder(); public string Message { @@ -124,7 +127,7 @@ namespace log4net.Tests.Appender _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = - System.Globalization.CultureInfo.InvariantCulture; + CultureInfo.InvariantCulture; } /// <summary> @@ -136,28 +139,17 @@ namespace log4net.Tests.Appender ResetAndDeleteTestFiles(); // restore previous culture - System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture; - System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture; + System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture!; + System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture!; } /// <summary> /// Finds the number of files that match the base file name, /// and matches the result against an expected count /// </summary> - /// <param name="iExpectedCount"></param> - private static void VerifyFileCount(int iExpectedCount) + private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension = false) { - VerifyFileCount(iExpectedCount, false); - } - - /// <summary> - /// Finds the number of files that match the base file name, - /// and matches the result against an expected count - /// </summary> - /// <param name="iExpectedCount"></param> - private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension) - { - ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension); + List<string> alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension); Assert.IsNotNull(alFiles); Assert.AreEqual(iExpectedCount, alFiles.Count); } @@ -165,12 +157,11 @@ namespace log4net.Tests.Appender /// <summary> /// Creates a file with the given number, and the shared base file name /// </summary> - /// <param name="iFileNumber"></param> private static void CreateFile(int iFileNumber) { FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber)); - FileStream fileStream = null; + FileStream? fileStream = null; try { fileStream = fileInfo.Create(); @@ -185,6 +176,7 @@ namespace log4net.Tests.Appender } catch { + // Ignore } } } @@ -251,7 +243,7 @@ namespace log4net.Tests.Appender /// </summary> private static void DeleteTestFiles() { - ArrayList alFiles = GetExistingFiles(c_fileName); + List<string> alFiles = GetExistingFiles(c_fileName); alFiles.AddRange(GetExistingFiles(c_fileName, true)); foreach (string sFile in alFiles) { @@ -342,16 +334,6 @@ namespace log4net.Tests.Appender /// </summary> public sealed class RollFileEntry { - /// <summary> - /// Stores the name of the file - /// </summary> - private string m_fileName; - - /// <summary> - /// The expected length of the file - /// </summary> - private long m_fileLength; - /// <summary> /// Default constructor /// </summary> @@ -361,29 +343,21 @@ namespace log4net.Tests.Appender /// <summary> /// Constructor used when the fileInfo and expected length are known /// </summary> - /// <param name="fileName"></param> - /// <param name="fileLength"></param> public RollFileEntry(string fileName, long fileLength) { - m_fileName = fileName; - m_fileLength = fileLength; + FileName = fileName; + FileLength = fileLength; } /// <summary> - /// Stores the name of the file + /// Gets the name of the file /// </summary> - public string FileName - { - get { return m_fileName; } - } + public string? FileName { get; } /// <summary> /// The expected length of the file /// </summary> - public long FileLength - { - get { return m_fileLength; } - } + public long FileLength { get; } } /// <summary> @@ -396,13 +370,13 @@ namespace log4net.Tests.Appender /// A table of entries showing files that should exist and their expected sizes /// before logging is called /// </summary> - private RollFileEntry[] m_preLogFileEntries; + private readonly RollFileEntry[] m_preLogFileEntries; /// <summary> /// A table of entries showing files that should exist and their expected sizes /// after a message is logged /// </summary> - private RollFileEntry[] m_postLogFileEntries; + private readonly RollFileEntry[] m_postLogFileEntries; /// <summary> /// Constructor, taking all required parameters @@ -434,7 +408,7 @@ namespace log4net.Tests.Appender } } - private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting, + private static void VerifyExistenceAndRemoveFromList(List<string> alExisting, string sFileName, FileInfo file, RollFileEntry entry) @@ -453,36 +427,30 @@ namespace log4net.Tests.Appender /// <param name="fileEntries"></param> private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries) { - ArrayList alExisting = GetExistingFiles(sBaseFileName); - if (null != fileEntries) + List<string> alExisting = GetExistingFiles(sBaseFileName); + // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length ); + foreach (RollFileEntry rollFile in fileEntries) { - // AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length ); - foreach (RollFileEntry rollFile in fileEntries) + string? sFileName = rollFile.FileName; + Assert.IsNotNull(sFileName); + FileInfo file = new FileInfo(sFileName!); + + if (rollFile.FileLength > 0) { - string sFileName = rollFile.FileName; - FileInfo file = new FileInfo(sFileName); + Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName); + VerifyExistenceAndRemoveFromList(alExisting, sFileName!, file, rollFile); + } + else + { + // If length is 0, file may not exist yet. If file exists, make sure length + // is zero. If file doesn't exist, this is OK - if (rollFile.FileLength > 0) - { - Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName); - VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); - } - else + if (file.Exists) { - // If length is 0, file may not exist yet. If file exists, make sure length - // is zero. If file doesn't exist, this is OK - - if (file.Exists) - { - VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile); - } + VerifyExistenceAndRemoveFromList(alExisting, sFileName!, file, rollFile); } } } - else - { - Assert.AreEqual(0, alExisting.Count); - } // This check ensures no extra files matching the wildcard pattern exist. // We only want the files we expect, and no others @@ -517,12 +485,12 @@ namespace log4net.Tests.Appender /// Logs a message, verifying the expected message counts against the /// current running totals. /// </summary> - /// <param name="entry"></param> - /// <param name="sMessageToLog"></param> - private void LogMessage(RollConditions entry, string sMessageToLog) + private void LogMessage(string sMessageToLog) { - Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++); - _root.Log(Level.Debug, sMessageToLog, null); + Assert.IsNotNull(_caRoot); + Assert.AreEqual(_caRoot!.Counter, _iMessagesLogged++); + Assert.IsNotNull(_root); + _root!.Log(Level.Debug, sMessageToLog, null); Assert.AreEqual(_caRoot.Counter, _iMessagesLogged); _iMessagesLoggedThisFile++; } @@ -567,7 +535,7 @@ namespace log4net.Tests.Appender // System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions"); VerifyPreConditions(sBaseFileName, entry); // System.Diagnostics.Debug.WriteLine( i + ": Logging message"); - LogMessage(entry, sMessageToLog); + LogMessage(sMessageToLog); // System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions"); VerifyPostConditions(sBaseFileName, entry); // System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n"); @@ -633,7 +601,7 @@ namespace log4net.Tests.Appender { string[] sFiles = sBackupGroup.Split(' '); - ArrayList alEntries = new ArrayList(); + var alEntries = new List<RollFileEntry>(); for (int i = 0; i < sFiles.Length; i++) { @@ -644,7 +612,7 @@ namespace log4net.Tests.Appender } } - return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry)); + return alEntries.ToArray(); } /// <summary> @@ -701,7 +669,7 @@ namespace log4net.Tests.Appender /// <param name="sBackupGroups"></param> /// <param name="stats"></param> /// <returns></returns> - private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats) + private static RollFileEntry[]? MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats) { if (0 == stats.NumberOfFileRolls) { @@ -719,11 +687,6 @@ namespace log4net.Tests.Appender /// </summary> public sealed class RollingStats { - private int iTotalMessageLength; - private int iMessagesPerFile; - private int iMessagesThisFile; - private int iNumberOfFileRolls; - /// <summary> /// Number of total bytes a log file can reach. /// </summary> @@ -737,39 +700,23 @@ namespace log4net.Tests.Appender /// This length assumes all messages are a fixed length for /// test purposes. /// </summary> - public int TotalMessageLength - { - get { return iTotalMessageLength; } - set { iTotalMessageLength = value; } - } + public int TotalMessageLength { get; set; } /// <summary> /// A count of the number of messages that are logged to each /// file. /// </summary> - public int MessagesPerFile - { - get { return iMessagesPerFile; } - set { iMessagesPerFile = value; } - } + public int MessagesPerFile { get; set; } /// <summary> /// Counts how many messages have been logged to the current file /// </summary> - public int MessagesThisFile - { - get { return iMessagesThisFile; } - set { iMessagesThisFile = value; } - } + public int MessagesThisFile { get; set; } /// <summary> /// Counts how many times a file roll has occurred /// </summary> - public int NumberOfFileRolls - { - get { return iNumberOfFileRolls; } - set { iNumberOfFileRolls = value; } - } + public int NumberOfFileRolls { get; set; } } /// <summary> @@ -799,7 +746,7 @@ namespace log4net.Tests.Appender /// <param name="existing"></param> /// <param name="final"></param> /// <returns></returns> - private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final) + private static RollFileEntry[] AddFinalElement(RollFileEntry[]? existing, RollFileEntry final) { int iLength = 1; if (null != existing) @@ -821,19 +768,13 @@ namespace log4net.Tests.Appender /// Generates the pre and post condition arrays from an array of backup files and the /// current file / next file. /// </summary> - /// <param name="sBackupFiles"></param> - /// <param name="preCondition"></param> - /// <param name="current"></param> - /// <param name="currentNext"></param> - /// <param name="rollingStats"></param> - /// <returns></returns> private static RollConditions BuildTableEntry(string sBackupFiles, - RollConditions preCondition, + RollConditions? preCondition, RollFileEntry current, RollFileEntry currentNext, RollingStats rollingStats) { - RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats); + RollFileEntry[]? backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats); RollFileEntry[] post = AddFinalElement(backupsPost, currentNext); if (null == preCondition) { @@ -910,7 +851,7 @@ namespace log4net.Tests.Appender sTestMessage, sBackupInfo, iMessagesToLog, - new MatchEvaluator(NumberedNameMaker)); + NumberedNameMaker); } /// <summary> @@ -936,7 +877,7 @@ namespace log4net.Tests.Appender RollingStats rollingStats = InitializeStats(sTestMessage); - RollConditions preCondition = null; + RollConditions? preCondition = null; rollingStats.MessagesThisFile = 0; RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0); @@ -1204,7 +1145,7 @@ namespace log4net.Tests.Appender /// <param name="alFiles"></param> /// <param name="iExpectedCurSizeRollBackups"></param> private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile, - ArrayList alFiles, + List<string> alFiles, int iExpectedCurSizeRollBackups) { InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"), @@ -1219,7 +1160,7 @@ namespace log4net.Tests.Appender public void TestInitializeRollBackups1() { string sBaseFile = "LogFile.log"; - ArrayList arrFiles = new ArrayList(); + List<string> arrFiles = new List<string>(); arrFiles.Add("junk1"); arrFiles.Add("junk1.log"); arrFiles.Add("junk2.log"); @@ -1236,7 +1177,7 @@ namespace log4net.Tests.Appender /// <param name="sBaseFile"></param> private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile) { - ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2"); + List<string> alFiles = MakeTestDataFromString(sBaseFile, "0,1,2"); int iExpectedCurSizeRollBackups = 2; VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups); @@ -1248,7 +1189,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpFixed() { - ArrayList alFiles = MakeTestDataFromString("3,4,5"); + List<string> alFiles = MakeTestDataFromString("3,4,5"); int iExpectedValue = 5; InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); } @@ -1259,7 +1200,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpFixed2() { - ArrayList alFiles = MakeTestDataFromString("0,3"); + List<string> alFiles = MakeTestDataFromString("0,3"); int iExpectedValue = 3; InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue); } @@ -1271,7 +1212,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpZeroBackups() { - ArrayList alFiles = MakeTestDataFromString("0,3"); + List<string> alFiles = MakeTestDataFromString("0,3"); int iExpectedValue = 0; InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue); } @@ -1283,7 +1224,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownZeroBackups() { - ArrayList alFiles = MakeTestDataFromString("0,3"); + List<string> alFiles = MakeTestDataFromString("0,3"); int iExpectedValue = 0; InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue); } @@ -1295,7 +1236,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed() { - ArrayList alFiles = MakeTestDataFromString("4,5,6"); + List<string> alFiles = MakeTestDataFromString("4,5,6"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0); } @@ -1305,7 +1246,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed2() { - ArrayList alFiles = MakeTestDataFromString("1,5,6"); + List<string> alFiles = MakeTestDataFromString("1,5,6"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1); } @@ -1315,7 +1256,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed3() { - ArrayList alFiles = MakeTestDataFromString("2,5,6"); + List<string> alFiles = MakeTestDataFromString("2,5,6"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); } @@ -1325,7 +1266,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed4() { - ArrayList alFiles = MakeTestDataFromString("3,5,6"); + List<string> alFiles = MakeTestDataFromString("3,5,6"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); } @@ -1335,7 +1276,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed5() { - ArrayList alFiles = MakeTestDataFromString("1,2,3"); + List<string> alFiles = MakeTestDataFromString("1,2,3"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); } @@ -1345,7 +1286,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed6() { - ArrayList alFiles = MakeTestDataFromString("1,2"); + List<string> alFiles = MakeTestDataFromString("1,2"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2); } @@ -1355,17 +1296,18 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownFixed7() { - ArrayList alFiles = MakeTestDataFromString("2,3"); + List<string> alFiles = MakeTestDataFromString("2,3"); VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3); } - private static void InitializeAndVerifyExpectedValue(ArrayList alFiles, + private static void InitializeAndVerifyExpectedValue( + List<string> alFiles, string sBaseFile, RollingFileAppender rfa, int iExpectedValue) { - InitializeRollBackups(rfa, sBaseFile, alFiles); - Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa)); + rfa.InitializeRollBackups(sBaseFile, alFiles); + Assert.AreEqual(iExpectedValue, rfa.m_curSizeRollBackups); } /// <summary> @@ -1375,7 +1317,7 @@ namespace log4net.Tests.Appender /// <param name="alFiles"></param> /// <param name="sBaseFile"></param> /// <param name="iExpectedValue"></param> - private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles, + private static void VerifyInitializeDownInfiniteExpectedValue(List<string> alFiles, string sBaseFile, int iExpectedValue) { @@ -1400,8 +1342,8 @@ namespace log4net.Tests.Appender RollingFileAppender rfa = new RollingFileAppender(); rfa.RollingStyle = RollingFileAppender.RollingMode.Size; - SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim())); - SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim())); + rfa.MaxSizeRollBackups = Int32.Parse(asParams[0].Trim()); + rfa.m_curSizeRollBackups = Int32.Parse(asParams[1].Trim()); rfa.CountDirection = Int32.Parse(asParams[2].Trim()); return rfa; @@ -1414,7 +1356,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownInfinite() { - ArrayList alFiles = MakeTestDataFromString("2,3"); + List<string> alFiles = MakeTestDataFromString("2,3"); VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3); } @@ -1425,7 +1367,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownInfinite2() { - ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); + List<string> alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); } @@ -1436,7 +1378,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountDownInfinite3() { - ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); + List<string> alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10); } @@ -1447,7 +1389,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpInfinite() { - ArrayList alFiles = MakeTestDataFromString("2,3"); + List<string> alFiles = MakeTestDataFromString("2,3"); VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3); } @@ -1458,7 +1400,7 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpInfinite2() { - ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); + List<string> alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10"); VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); } @@ -1469,24 +1411,10 @@ namespace log4net.Tests.Appender [Test] public void TestInitializeCountUpInfinite3() { - ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); + List<string> alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8"); VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10); } - /// <summary> - /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger - /// </summary> - /// <param name="filename">The filename to log to</param> - /// <param name="lockModel">The locking model to use.</param> - /// <param name="handler">The error handler to use.</param> - /// <returns>A configured ILogger</returns> - private static ILogger CreateLogger(string filename, - FileAppender.LockingModelBase lockModel, - IErrorHandler handler) - { - return CreateLogger(filename, lockModel, handler, 100000, 0); - } - /// <summary> /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger /// </summary> @@ -1497,10 +1425,10 @@ namespace log4net.Tests.Appender /// <param name="maxSizeRollBackups">Maximum number of roll backups</param> /// <returns>A configured ILogger</returns> private static ILogger CreateLogger(string filename, - FileAppender.LockingModelBase lockModel, + FileAppender.LockingModelBase? lockModel, IErrorHandler handler, - int maxFileSize, - int maxSizeRollBackups) + int maxFileSize = 100000, + int maxSizeRollBackups = 0) { Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository"); @@ -1847,7 +1775,7 @@ namespace log4net.Tests.Appender Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured"); RollingFileAppender rfa = (RollingFileAppender)(appenders[0]); - Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(), + Assert.AreEqual(typeof(FileAppender.ExclusiveLock), rfa.LockingModel.GetType(), "The LockingModel is of an unexpected type"); DestroyLogger(); @@ -1857,10 +1785,8 @@ namespace log4net.Tests.Appender /// Tests the count up case, with infinite max backups , to see that /// initialization of the rolling file appender results in the expected value /// </summary> - /// <param name="alFiles"></param> - /// <param name="sBaseFile"></param> - /// <param name="iExpectedValue"></param> - private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles, + private static void VerifyInitializeUpInfiniteExpectedValue( + List<string> alFiles, string sBaseFile, int iExpectedValue) { @@ -1872,10 +1798,8 @@ namespace log4net.Tests.Appender /// Tests the count down case, with max backups limited to 3, to see that /// initialization of the rolling file appender results in the expected value /// </summary> - /// <param name="alFiles"></param> - /// <param name="sBaseFile"></param> - /// <param name="iExpectedValue"></param> - private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles, + private static void VerifyInitializeDownFixedExpectedValue( + List<string> alFiles, string sBaseFile, int iExpectedValue) { @@ -1890,8 +1814,7 @@ namespace log4net.Tests.Appender /// /// </summary> /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param> - /// <returns></returns> - private static ArrayList MakeTestDataFromString(string sFileNumbers) + private static List<string> MakeTestDataFromString(string sFileNumbers) { return MakeTestDataFromString(c_fileName, sFileNumbers); } @@ -1905,9 +1828,9 @@ namespace log4net.Tests.Appender /// <param name="sFileName">Name of file to combine with numbers when generating counted file names</param> /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param> /// <returns></returns> - private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers) + private static List<string> MakeTestDataFromString(string sFileName, string sFileNumbers) { - ArrayList alFiles = new ArrayList(); + var alFiles = new List<string>(); string[] sNumbers = sFileNumbers.Split(','); foreach (string sNumber in sNumbers) @@ -1943,12 +1866,10 @@ namespace log4net.Tests.Appender /// Makes sure that the initialization can detect the backup /// number correctly. /// </summary> - /// <param name="iBackups"></param> - /// <param name="iMaxSizeRollBackups"></param> - public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups) + private void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups) { string sBaseFile = "LogFile.log"; - ArrayList arrFiles = new ArrayList(); + var arrFiles = new List<string>(); arrFiles.Add("junk1"); for (int i = 0; i < iBackups; i++) { @@ -1957,9 +1878,9 @@ namespace log4net.Tests.Appender RollingFileAppender rfa = new RollingFileAppender(); rfa.RollingStyle = RollingFileAppender.RollingMode.Size; - SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups); - SetFieldCurSizeRollBackups(rfa, 0); - InitializeRollBackups(rfa, sBaseFile, arrFiles); + rfa.MaxSizeRollBackups = iMaxSizeRollBackups; + rfa.m_curSizeRollBackups = 0; + rfa.InitializeRollBackups(sBaseFile, arrFiles); // iBackups / Meaning // 0 = none @@ -1969,11 +1890,11 @@ namespace log4net.Tests.Appender if (0 == iBackups || 1 == iBackups) { - Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa)); + Assert.AreEqual(0, rfa.m_curSizeRollBackups); } else { - Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa)); + Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), rfa.m_curSizeRollBackups); } } @@ -2004,45 +1925,22 @@ namespace log4net.Tests.Appender [Test] public void TestCreateCloseNoActivateOptions() { - var appender = new RollingFileAppender(); - appender.Close(); + var appender = new RollingFileAppender(); + appender.Close(); } + // // Helper functions to dig into the appender // - private static ArrayList GetExistingFiles(string baseFilePath) + private static List<string> GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension = false) { - return GetExistingFiles(baseFilePath, false); - } - - private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension) - { - RollingFileAppender appender = new RollingFileAppender(); - appender.PreserveLogFileNameExtension = preserveLogFileNameExtension; - appender.SecurityContext = NullSecurityContext.Instance; - - return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath); - } - - private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles) - { - Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles); - } - - private static int GetFieldCurSizeRollBackups(RollingFileAppender appender) - { - return (int)Utils.GetField(appender, "m_curSizeRollBackups"); - } - - private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val) - { - Utils.SetField(appender, "m_curSizeRollBackups", val); - } - - private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val) - { - Utils.SetField(appender, "m_maxSizeRollBackups", val); + RollingFileAppender appender = new RollingFileAppender + { + PreserveLogFileNameExtension = preserveLogFileNameExtension, + SecurityContext = NullSecurityContext.Instance + }; + return appender.GetExistingFiles(baseFilePath); } private static string GetTestMessage() @@ -2069,20 +1967,15 @@ namespace log4net.Tests.Appender { RollingFileAppender rfa = new RollingFileAppender(); - Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"), + Assert.AreEqual(RollPoint.TopOfMinute, rfa.ComputeCheckPeriod(".yyyy-MM-dd HH:mm"), "TopOfMinute pattern"); - Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern"); - Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern"); - Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern"); - Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern"); + Assert.AreEqual(RollPoint.TopOfHour, rfa.ComputeCheckPeriod(".yyyy-MM-dd HH"), "TopOfHour pattern"); + Assert.AreEqual(RollPoint.HalfDay, rfa.ComputeCheckPeriod(".yyyy-MM-dd tt"), "HalfDay pattern"); + Assert.AreEqual(RollPoint.TopOfDay, rfa.ComputeCheckPeriod(".yyyy-MM-dd"), "TopOfDay pattern"); + Assert.AreEqual(RollPoint.TopOfMonth, rfa.ComputeCheckPeriod(".yyyy-MM"), "TopOfMonth pattern"); // Test invalid roll point - Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern"); - } - - private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern) - { - return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern); + Assert.AreEqual(RollPoint.InvalidRollPoint, rfa.ComputeCheckPeriod("..."), "TopOfMonth pattern"); } } } \ No newline at end of file diff --git a/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs b/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs index 30246cad..2ad2c712 100644 --- a/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs +++ b/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs @@ -21,6 +21,7 @@ using System; using System.IO; +using log4net.Util.PatternStringConverters; using NUnit.Framework; namespace log4net.Tests.Util @@ -87,26 +88,5 @@ namespace log4net.Tests.Util Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null); } - - private sealed class EnvironmentPatternConverter - { - private object target = null; - - public EnvironmentPatternConverter() - { - target = Utils.CreateInstance("log4net.Util.PatternStringConverters.EnvironmentPatternConverter,log4net"); - } - - public string Option - { - get { return Utils.GetProperty(target, "Option") as string; } - set { Utils.SetProperty(target, "Option", value); } - } - - public void Convert(TextWriter writer, object state) - { - Utils.InvokeMethod(target, "Convert", writer, state); - } - } } } \ No newline at end of file diff --git a/src/log4net.Tests/Util/PatternConverterTest.cs b/src/log4net.Tests/Util/PatternConverterTest.cs index e8830f31..e8e511e5 100644 --- a/src/log4net.Tests/Util/PatternConverterTest.cs +++ b/src/log4net.Tests/Util/PatternConverterTest.cs @@ -156,7 +156,7 @@ namespace log4net.Tests.Util mostRecentInstance = this; } - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { writer.Write(Properties.GetKeys().Length); } diff --git a/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs b/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs index adb3e406..fa4ccf36 100644 --- a/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs +++ b/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs @@ -18,7 +18,7 @@ #endregion using System.IO; - +using log4net.Util.PatternStringConverters; using NUnit.Framework; namespace log4net.Tests.Util @@ -60,31 +60,5 @@ namespace log4net.Tests.Util string string2 = sw.ToString(); Assert.IsTrue(string1 != string2, "strings should be different"); } - - private class RandomStringPatternConverter - { - private object target = null; - - public RandomStringPatternConverter() - { - target = Utils.CreateInstance("log4net.Util.PatternStringConverters.RandomStringPatternConverter,log4net"); - } - - public string Option - { - get { return Utils.GetProperty(target, "Option") as string; } - set { Utils.SetProperty(target, "Option", value); } - } - - public void Convert(TextWriter writer, object state) - { - Utils.InvokeMethod(target, "Convert", writer, state); - } - - public void ActivateOptions() - { - Utils.InvokeMethod(target, "ActivateOptions"); - } - } } } \ No newline at end of file diff --git a/src/log4net.Tests/Utils.cs b/src/log4net.Tests/Utils.cs index 67b28421..0f9c2b41 100644 --- a/src/log4net.Tests/Utils.cs +++ b/src/log4net.Tests/Utils.cs @@ -18,89 +18,14 @@ #endregion using log4net.Repository; -using System; -using System.Reflection; namespace log4net.Tests { /// <summary> /// Summary description for Class1. /// </summary> - public class Utils + public static class Utils { - private Utils() - { - } - - public static object CreateInstance(string targetType) - { - return CreateInstance(Type.GetType(targetType, true, true)); - } - - public static object CreateInstance(Type targetType) - { - return targetType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null).Invoke(null); - } - - public static object InvokeMethod(object target, string name, params object[] args) - { - return target.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, GetTypesArray(args), null).Invoke(target, args); - } - - public static object InvokeMethod(Type target, string name, params object[] args) - { - return target.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static, null, GetTypesArray(args), null).Invoke(null, args); - } - - public static object GetField(object target, string name) - { - return target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target); - } - - public static void SetField(object target, string name, object val) - { - target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val); - } - - public static object GetProperty(object target, string name) - { - return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, null); - } - - public static void SetProperty(object target, string name, object val) - { - target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, null); - } - - public static object GetProperty(object target, string name, params object[] index) - { - return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, index); - } - - public static void SetProperty(object target, string name, object val, params object[] index) - { - target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, index); - } - - private static Type[] GetTypesArray(object[] args) - { - Type[] types = new Type[args.Length]; - - for (int i = 0; i < args.Length; i++) - { - if (args[i] == null) - { - types[i] = typeof(object); - } - else - { - types[i] = args[i].GetType(); - } - } - - return types; - } - internal const string PROPERTY_KEY = "prop1"; internal static void RemovePropertyFromAllContexts() diff --git a/src/log4net.Tests/log4net.Tests.csproj b/src/log4net.Tests/log4net.Tests.csproj index 34cb181f..854bc6ad 100644 --- a/src/log4net.Tests/log4net.Tests.csproj +++ b/src/log4net.Tests/log4net.Tests.csproj @@ -30,6 +30,8 @@ <Deterministic>true</Deterministic> <!-- suppress analyzer mismatch warning --> <NoWarn>CS8032</NoWarn> + <SignAssembly>true</SignAssembly> + <AssemblyOriginatorKeyFile>..\..\log4net.snk</AssemblyOriginatorKeyFile> </PropertyGroup> <PropertyGroup> <BaseAddress>285212672</BaseAddress> diff --git a/src/log4net/Appender/EventLogAppender.cs b/src/log4net/Appender/EventLogAppender.cs index 4416c022..1a7991e2 100644 --- a/src/log4net/Appender/EventLogAppender.cs +++ b/src/log4net/Appender/EventLogAppender.cs @@ -494,7 +494,7 @@ namespace log4net.Appender /// <see cref="Level"/> this is a one way mapping. There is /// a loss of information during the conversion. /// </remarks> - protected virtual EventLogEntryType GetEntryType(Level level) + protected internal virtual EventLogEntryType GetEntryType(Level level) { // see if there is a specified lookup. Level2EventLogEntryType entryType = m_levelMapping.Lookup(level) as Level2EventLogEntryType; diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs index c901c219..843ea1d4 100644 --- a/src/log4net/Appender/FileAppender.cs +++ b/src/log4net/Appender/FileAppender.cs @@ -29,6 +29,8 @@ using log4net.Layout; using log4net.Core; using System.Threading.Tasks; +#nullable enable + namespace log4net.Appender { /// <summary> @@ -110,16 +112,16 @@ namespace log4net.Appender } } - private Stream m_realStream = null; + private Stream? m_realStream; private readonly LockingModelBase m_lockingModel; - private int m_lockLevel = 0; + private int m_lockLevel; public LockingStream(LockingModelBase locking) : base() { if (locking == null) { - throw new ArgumentException("Locking model may not be null", "locking"); + throw new ArgumentException("Locking model may not be null", nameof(locking)); } m_lockingModel = locking; @@ -135,8 +137,7 @@ namespace log4net.Appender public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { - AssertLocked(); - return m_realStream.ReadAsync(buffer, offset, count, cancellationToken); + return AssertLocked().ReadAsync(buffer, offset, count, cancellationToken); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) @@ -145,32 +146,29 @@ namespace log4net.Appender return base.WriteAsync(buffer, offset, count, cancellationToken); } - public override void Flush() + public override void Flush() { - AssertLocked(); - m_realStream.Flush(); + AssertLocked().Flush(); } public override int Read(byte[] buffer, int offset, int count) { - return m_realStream.Read(buffer, offset, count); + return AssertLocked().Read(buffer, offset, count); } public override int ReadByte() { - return m_realStream.ReadByte(); + return AssertLocked().ReadByte(); } public override long Seek(long offset, SeekOrigin origin) { - AssertLocked(); - return m_realStream.Seek(offset, origin); + return AssertLocked().Seek(offset, origin); } public override void SetLength(long value) { - AssertLocked(); - m_realStream.SetLength(value); + AssertLocked().SetLength(value); } void IDisposable.Dispose() @@ -180,14 +178,12 @@ namespace log4net.Appender public override void Write(byte[] buffer, int offset, int count) { - AssertLocked(); - m_realStream.Write(buffer, offset, count); + AssertLocked().Write(buffer, offset, count); } public override void WriteByte(byte value) { - AssertLocked(); - m_realStream.WriteByte(value); + AssertLocked().WriteByte(value); } // Properties @@ -200,8 +196,7 @@ namespace log4net.Appender { get { - AssertLocked(); - return m_realStream.CanSeek; + return AssertLocked().CanSeek; } } @@ -209,8 +204,7 @@ namespace log4net.Appender { get { - AssertLocked(); - return m_realStream.CanWrite; + return AssertLocked().CanWrite; } } @@ -218,8 +212,7 @@ namespace log4net.Appender { get { - AssertLocked(); - return m_realStream.Length; + return AssertLocked().Length; } } @@ -227,26 +220,26 @@ namespace log4net.Appender { get { - AssertLocked(); - return m_realStream.Position; + return AssertLocked().Position; } set { - AssertLocked(); - m_realStream.Position = value; + AssertLocked().Position = value; } } - #endregion Override Implementation of Stream + #endregion Override Implementation of Stream - #region Locking Methods + #region Locking Methods - private void AssertLocked() + private Stream AssertLocked() { if (m_realStream == null) { throw new LockStateException("The file is not currently locked"); } + + return m_realStream; } public bool AcquireLock() @@ -301,8 +294,6 @@ namespace log4net.Appender /// </remarks> public abstract class LockingModelBase { - private FileAppender m_appender = null; - /// <summary> /// Open the output file /// </summary> @@ -342,23 +333,23 @@ namespace log4net.Appender /// <summary> /// Acquire the lock on the file /// </summary> - /// <returns>A stream that is ready to be written to.</returns> + /// <returns>A stream that is ready to be written to, or null if there is no active stream because uninitialized or error.</returns> /// <remarks> /// <para> - /// Acquire the lock on the file in preparation for writing to it. - /// Return a stream pointing to the file. <see cref="ReleaseLock"/> - /// must be called to release the lock on the output file. + /// Acquire the lock on the file in preparation for writing to it. + /// Returns a stream pointing to the file. <see cref="ReleaseLock"/> + /// must be called to release the lock on the output file when the return + /// value is not null. /// </para> /// </remarks> - public abstract Stream AcquireLock(); + public abstract Stream? AcquireLock(); /// <summary> - /// Release the lock on the file + /// Releases the lock on the file /// </summary> /// <remarks> /// <para> - /// Release the lock on the file. No further writes will be made to the - /// stream until <see cref="AcquireLock"/> is called again. + /// No further writes will be made to the stream until <see cref="AcquireLock"/> is called again. /// </para> /// </remarks> public abstract void ReleaseLock(); @@ -382,11 +373,7 @@ namespace log4net.Appender /// called. /// </para> /// </remarks> - public FileAppender CurrentAppender - { - get { return m_appender; } - set { m_appender = value; } - } + public FileAppender? CurrentAppender { get; set; } /// <summary> /// Helper method that creates a FileStream under CurrentAppender's SecurityContext. @@ -397,7 +384,7 @@ namespace log4net.Appender /// </para> /// <para> /// If the directory portion of the <paramref name="filename"/> does not exist, it is created - /// via Directory.CreateDirecctory. + /// via Directory.CreateDirectory. /// </para> /// </remarks> /// <param name="filename"></param> @@ -407,14 +394,14 @@ namespace log4net.Appender protected Stream CreateStream(string filename, bool append, FileShare fileShare) { filename = Environment.ExpandEnvironmentVariables(filename); - using (CurrentAppender.SecurityContext.Impersonate(this)) + using (CurrentAppender?.SecurityContext?.Impersonate(this)) { // Ensure that the directory structure exists - string directoryFullName = Path.GetDirectoryName(filename); + string? directoryFullName = Path.GetDirectoryName(filename); // Only create the directory if it does not exist // doing this check here resolves some permissions failures - if (!Directory.Exists(directoryFullName)) + if (directoryFullName is not null && !Directory.Exists(directoryFullName)) { Directory.CreateDirectory(directoryFullName); } @@ -435,7 +422,7 @@ namespace log4net.Appender /// <param name="stream"></param> protected void CloseStream(Stream stream) { - using (CurrentAppender.SecurityContext.Impersonate(this)) + using (CurrentAppender?.SecurityContext?.Impersonate(this)) { stream.Dispose(); } @@ -453,7 +440,7 @@ namespace log4net.Appender /// </remarks> public class ExclusiveLock : LockingModelBase { - private Stream m_stream = null; + private Stream? m_stream; /// <summary> /// Open the file specified and prepare for logging. @@ -477,7 +464,7 @@ namespace log4net.Appender } catch (Exception e1) { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + + CurrentAppender?.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); } } @@ -492,8 +479,11 @@ namespace log4net.Appender /// </remarks> public override void CloseFile() { - CloseStream(m_stream); - m_stream = null; + if (m_stream is not null) + { + CloseStream(m_stream); + m_stream = null; + } } /// <summary> @@ -505,9 +495,9 @@ namespace log4net.Appender /// Does nothing. The lock is already taken /// </para> /// </remarks> - public override Stream AcquireLock() + public override Stream? AcquireLock() { - return m_stream; + return m_stream; } /// <summary> @@ -553,9 +543,9 @@ namespace log4net.Appender /// </remarks> public class MinimalLock : LockingModelBase { - private string m_filename; + private string? m_filename; private bool m_append; - private Stream m_stream = null; + private Stream? m_stream; /// <summary> /// Prepares to open the file when the first message is logged. @@ -601,19 +591,26 @@ namespace log4net.Appender /// must be called to release the lock on the output file. /// </para> /// </remarks> - public override Stream AcquireLock() + public override Stream? AcquireLock() { - if (m_stream == null) + if (m_stream is null) { - try + if (m_filename is not null) { - m_stream = CreateStream(m_filename, m_append, FileShare.Read); - m_append = true; + try + { + m_stream = CreateStream(m_filename, m_append, FileShare.Read); + m_append = true; + } + catch (Exception e1) + { + CurrentAppender?.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " + + e1.Message); + } } - catch (Exception e1) + else { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " + - e1.Message); + CurrentAppender?.ErrorHandler.Error($"Unable to acquire lock because {nameof(OpenFile)} has not been called"); } } @@ -631,8 +628,11 @@ namespace log4net.Appender /// </remarks> public override void ReleaseLock() { - CloseStream(m_stream); - m_stream = null; + if (m_stream is not null) + { + CloseStream(m_stream); + m_stream = null; + } } /// <summary> @@ -659,9 +659,9 @@ namespace log4net.Appender /// <author>Steve Wranovsky</author> public class InterProcessLock : LockingModelBase { - private Mutex m_mutex = null; - private Stream m_stream = null; - private int m_recursiveWatch = 0; + private Mutex? m_mutex; + private Stream? m_stream; + private int m_recursiveWatch; /// <summary> /// Open the file specified and prepare for logging. @@ -686,7 +686,7 @@ namespace log4net.Appender } catch (Exception e1) { - CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + + CurrentAppender?.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + e1.Message); } } @@ -703,8 +703,11 @@ namespace log4net.Appender { try { - CloseStream(m_stream); - m_stream = null; + if (m_stream is not null) + { + CloseStream(m_stream); + m_stream = null; + } } finally { @@ -721,7 +724,7 @@ namespace log4net.Appender /// Does nothing. The lock is already taken /// </para> /// </remarks> - public override Stream AcquireLock() + public override Stream? AcquireLock() { if (m_mutex != null) { @@ -746,7 +749,7 @@ namespace log4net.Appender } else { - CurrentAppender.ErrorHandler.Error( + CurrentAppender?.ErrorHandler.Error( "Programming error, no mutex available to acquire lock! From here on things will be dangerous!"); } @@ -768,7 +771,7 @@ namespace log4net.Appender } else { - CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to release the lock!"); + CurrentAppender?.ErrorHandler.Error("Programming error, no mutex available to release the lock!"); } } @@ -779,16 +782,26 @@ namespace log4net.Appender { if (m_mutex == null) { - string mutexFriendlyFilename = CurrentAppender.File - .Replace("\\", "_") - .Replace(":", "_") - .Replace("/", "_"); + if (CurrentAppender is not null) + { + if (CurrentAppender.File is not null) + { + string mutexFriendlyFilename = CurrentAppender.File + .Replace("\\", "_") + .Replace(":", "_") + .Replace("/", "_"); - m_mutex = new Mutex(false, mutexFriendlyFilename); + m_mutex = new Mutex(false, mutexFriendlyFilename); + } + else + { + CurrentAppender.ErrorHandler.Error($"Current appender has no file name, {nameof(OpenFile)} not called or it encountered an error"); + } + } } else { - CurrentAppender.ErrorHandler.Error("Programming error, mutex already initialized!"); + CurrentAppender?.ErrorHandler.Error("Programming error, mutex already initialized!"); } } @@ -804,7 +817,7 @@ namespace log4net.Appender } else { - CurrentAppender.ErrorHandler.Error("Programming error, mutex not initialized!"); + CurrentAppender?.ErrorHandler.Error("Programming error, mutex not initialized!"); } } } @@ -820,7 +833,7 @@ namespace log4net.Appender /// </remarks> public class NoLock : LockingModelBase { - private Stream m_stream = null; + private Stream? m_stream; /// <summary> /// Open the file specified and prepare for logging. @@ -845,7 +858,7 @@ namespace log4net.Appender } catch (Exception e1) { - CurrentAppender.ErrorHandler.Error( + CurrentAppender?.ErrorHandler.Error( $"Unable to acquire lock on file {filename}. {e1.Message}" ); } @@ -861,8 +874,11 @@ namespace log4net.Appender /// </remarks> public override void CloseFile() { - CloseStream(m_stream); - m_stream = null; + if (m_stream is not null) + { + CloseStream(m_stream); + m_stream = null; + } } /// <summary> @@ -874,7 +890,7 @@ namespace log4net.Appender /// Does nothing. The lock is already taken /// </para> /// </remarks> - public override Stream AcquireLock() + public override Stream? AcquireLock() { return m_stream; } @@ -992,7 +1008,7 @@ namespace log4net.Appender /// the application base directory. /// </para> /// </remarks> - public virtual string File + public virtual string? File { get { return m_fileName; } set { m_fileName = value; } @@ -1012,11 +1028,7 @@ namespace log4net.Appender /// </para> /// The default value is true. /// </remarks> - public bool AppendToFile - { - get { return m_appendToFile; } - set { m_appendToFile = value; } - } + public bool AppendToFile { get; set; } = true; /// <summary> /// Gets or sets <see cref="Encoding"/> used to write to the file. @@ -1030,11 +1042,7 @@ namespace log4net.Appender /// which is the encoding for the system's current ANSI code page. /// </para> /// </remarks> - public Encoding Encoding - { - get { return m_encoding; } - set { m_encoding = value; } - } + public Encoding Encoding { get; set; } = Encoding.GetEncoding(0); /// <summary> /// Gets or sets the <see cref="SecurityContext"/> used to write to the file. @@ -1050,11 +1058,7 @@ namespace log4net.Appender /// of the current thread. /// </para> /// </remarks> - public SecurityContext SecurityContext - { - get { return m_securityContext; } - set { m_securityContext = value; } - } + public SecurityContext? SecurityContext { get; set; } /// <summary> /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file. @@ -1076,11 +1080,7 @@ namespace log4net.Appender /// The default locking model is the <see cref="FileAppender.ExclusiveLock"/>. /// </para> /// </remarks> - public FileAppender.LockingModelBase LockingModel - { - get { return m_lockingModel; } - set { m_lockingModel = value; } - } + public LockingModelBase LockingModel { get; set; } = (LockingModelBase)Activator.CreateInstance(defaultLockingModelType); #endregion Public Instance Properties @@ -1109,18 +1109,10 @@ namespace log4net.Appender { base.ActivateOptions(); - if (m_securityContext == null) - { - m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); - } + SecurityContext ??= SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); - if (m_lockingModel == null) - { - m_lockingModel = (LockingModelBase)Activator.CreateInstance(defaultLockingModelType); - } - - m_lockingModel.CurrentAppender = this; - m_lockingModel.ActivateOptions(); + LockingModel.CurrentAppender = this; + LockingModel.ActivateOptions(); if (m_fileName != null) { @@ -1129,7 +1121,7 @@ namespace log4net.Appender m_fileName = ConvertToFullPath(m_fileName.Trim()); } - SafeOpenFile(m_fileName, m_appendToFile); + SafeOpenFile(m_fileName, AppendToFile); } else { @@ -1162,7 +1154,7 @@ namespace log4net.Appender protected override void OnClose() { base.OnClose(); - m_lockingModel?.OnClose(); + LockingModel.OnClose(); } /// <summary> @@ -1176,7 +1168,10 @@ namespace log4net.Appender /// </remarks> protected override void PrepareWriter() { - SafeOpenFile(m_fileName, m_appendToFile); + if (m_fileName is not null) + { + SafeOpenFile(m_fileName, AppendToFile); + } } /// <summary> @@ -1195,7 +1190,7 @@ namespace log4net.Appender /// </remarks> protected override void Append(LoggingEvent loggingEvent) { - if (m_stream.AcquireLock()) + if (m_stream is not null && m_stream.AcquireLock()) { try { @@ -1221,7 +1216,7 @@ namespace log4net.Appender /// </remarks> protected override void Append(LoggingEvent[] loggingEvents) { - if (m_stream.AcquireLock()) + if (m_stream is not null && m_stream.AcquireLock()) { try { @@ -1375,8 +1370,8 @@ namespace log4net.Appender if (LogLog.IsErrorEnabled) { // Internal check that the fileName passed in is a rooted path - bool isPathRooted = false; - using (SecurityContext.Impersonate(this)) + bool isPathRooted; + using (SecurityContext?.Impersonate(this)) { isPathRooted = Path.IsPathRooted(fileName); } @@ -1396,10 +1391,10 @@ namespace log4net.Appender // Save these for later, allowing retries if file open fails m_fileName = fileName; - m_appendToFile = append; + AppendToFile = append; LockingModel.CurrentAppender = this; - LockingModel.OpenFile(fileName, append, m_encoding); + LockingModel.OpenFile(fileName, append, Encoding); m_stream = new LockingStream(LockingModel); if (m_stream != null) @@ -1438,7 +1433,7 @@ namespace log4net.Appender protected virtual void SetQWForFiles(Stream fileStream) { #pragma warning disable CA2000 // Dispose objects before losing scope - StreamWriter writer = new StreamWriter(fileStream, m_encoding); + StreamWriter writer = new StreamWriter(fileStream, Encoding); #pragma warning restore CA2000 // Dispose objects before losing scope SetQWForFiles(writer); } @@ -1484,36 +1479,15 @@ namespace log4net.Appender #region Private Instance Fields - /// <summary> - /// Flag to indicate if we should append to the file - /// or overwrite the file. The default is to append. - /// </summary> - private bool m_appendToFile = true; - /// <summary> /// The name of the log file. /// </summary> - private string m_fileName = null; - - /// <summary> - /// The encoding to use for the file stream. - /// </summary> - private Encoding m_encoding = Encoding.GetEncoding(0); - - /// <summary> - /// The security context to use for privileged calls - /// </summary> - private SecurityContext m_securityContext; + private string? m_fileName; /// <summary> /// The stream to log to. Has added locking semantics /// </summary> - private FileAppender.LockingStream m_stream = null; - - /// <summary> - /// The locking model to use - /// </summary> - private FileAppender.LockingModelBase m_lockingModel; + private LockingStream? m_stream; #endregion Private Instance Fields diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs index 48a30c69..1b8481f3 100644 --- a/src/log4net/Appender/RollingFileAppender.cs +++ b/src/log4net/Appender/RollingFileAppender.cs @@ -18,14 +18,19 @@ #endregion using System; -using System.Collections; +using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using log4net.Util; using log4net.Core; using System.Threading; +#nullable enable + +[assembly: InternalsVisibleTo("log4net.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100297dcac908e28689360399027b0ea4cd852fbb74e1ed95e695a5ba55cbd1d075ec20cdb5fa6fc593d3d571527b20558d6f39e1f4d5cfe0798428c589c311965244b209c38a02aaa8c9da3b72405b6fedeeb4292c3457e9769b74e645c19cb06c2be75fb2d12281a585fbeabf7bd195d6961ba113286fc3e286d7bbd69024ceda")] + namespace log4net.Appender { #if CONFIRM_WIN32_FILE_SHAREMODES @@ -182,7 +187,7 @@ namespace log4net.Appender /// The code assumes that the following 'time' constants are in a increasing sequence. /// </para> /// </remarks> - protected enum RollPoint + protected internal enum RollPoint { /// <summary> /// Roll the log not based on the date @@ -274,11 +279,7 @@ namespace log4net.Appender /// The default strategy is <see cref="RollingFileAppender.LocalDateTime"/>. /// </para> /// </remarks> - public IDateTime DateTimeStrategy - { - get { return m_dateTime; } - set { m_dateTime = value; } - } + public IDateTime DateTimeStrategy { get; set; } = new LocalDateTime(); /// <summary> /// Gets or sets the date pattern to be used for generating file names @@ -292,17 +293,14 @@ namespace log4net.Appender /// <para> /// Takes a string in the same format as expected by /// <see cref="log4net.DateFormatter.SimpleDateFormatter" />. + /// May be set to null to disable date formatting. /// </para> /// <para> /// This property determines the rollover schedule when rolling over /// on date. /// </para> /// </remarks> - public string DatePattern - { - get { return m_datePattern; } - set { m_datePattern = value; } - } + public string? DatePattern { get; set; } = ".yyyy-MM-dd"; /// <summary> /// Gets or sets the maximum number of backup files that are kept before @@ -327,11 +325,7 @@ namespace log4net.Appender /// <b>not</b> the total. /// </para> /// </remarks> - public int MaxSizeRollBackups - { - get { return m_maxSizeRollBackups; } - set { m_maxSizeRollBackups = value; } - } + public int MaxSizeRollBackups { get; set; } = 0; /// <summary> /// Gets or sets the maximum size that the output file is allowed to reach @@ -352,11 +346,7 @@ namespace log4net.Appender /// The default maximum file size is 10MB (10*1024*1024). /// </para> /// </remarks> - public long MaxFileSize - { - get { return m_maxFileSize; } - set { m_maxFileSize = value; } - } + public long MaxFileSize { get; set; } = 10 * 1024 * 1024; /// <summary> /// Gets or sets the maximum size that the output file is allowed to reach @@ -386,8 +376,8 @@ namespace log4net.Appender /// </remarks> public string MaximumFileSize { - get { return m_maxFileSize.ToString(NumberFormatInfo.InvariantInfo); } - set { m_maxFileSize = OptionConverter.ToFileSize(value, m_maxFileSize + 1); } + get { return MaxFileSize.ToString(NumberFormatInfo.InvariantInfo); } + set { MaxFileSize = OptionConverter.ToFileSize(value, MaxFileSize + 1); } } /// <summary> @@ -413,11 +403,7 @@ namespace log4net.Appender /// </para> /// <para>The default file count direction is -1.</para> /// </remarks> - public int CountDirection - { - get { return m_countDirection; } - set { m_countDirection = value; } - } + public int CountDirection { get; set; } = -1; /// <summary> /// Gets or sets the rolling style. @@ -476,16 +462,12 @@ namespace log4net.Appender /// <remarks> /// <para> /// By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. - /// However, under Windows the new file name will loose any program associations as the + /// However, under Windows the new file name will lose any program associations as the /// extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or /// file.curSizeRollBackup.log to maintain any program associations. /// </para> /// </remarks> - public bool PreserveLogFileNameExtension - { - get { return m_preserveLogFileNameExtension; } - set { m_preserveLogFileNameExtension = value; } - } + public bool PreserveLogFileNameExtension { get; set; } /// <summary> /// Gets or sets a value indicating whether to always log to @@ -506,11 +488,7 @@ namespace log4net.Appender /// much faster as the appender it won't have to rename all the backups! /// </para> /// </remarks> - public bool StaticLogFileName - { - get { return m_staticLogFileName; } - set { m_staticLogFileName = value; } - } + public bool StaticLogFileName { get; set; } = true; #endregion Public Instance Properties @@ -533,7 +511,7 @@ namespace log4net.Appender /// Sets the quiet writer being used. /// </summary> /// <remarks> - /// This method can be overridden by sub classes. + /// This method can be overridden by subclasses. /// </remarks> /// <param name="writer">the writer to set</param> protected override void SetQWForFiles(TextWriter writer) @@ -591,13 +569,10 @@ namespace log4net.Appender try { // if rolling should be locked, acquire the lock - if (m_mutexForRolling != null) - { - m_mutexForRolling.WaitOne(); - } + m_mutexForRolling?.WaitOne(); if (m_rollDate) { - var n = m_dateTime.Now; + var n = DateTimeStrategy.Now; if (n >= m_nextCheck) { m_now = n; @@ -609,7 +584,7 @@ namespace log4net.Appender if (m_rollSize) { - if ((File != null) && ((CountingQuietTextWriter)QuietWriter).Count >= m_maxFileSize) + if ((File != null) && ((CountingQuietTextWriter)QuietWriter).Count >= MaxFileSize) { RollOverSize(); } @@ -617,11 +592,8 @@ namespace log4net.Appender } finally { - // if rolling should be locked, release the lock - if (m_mutexForRolling != null) - { - m_mutexForRolling.ReleaseMutex(); - } + // if rolling should be locked, release the lock + m_mutexForRolling?.ReleaseMutex(); } } @@ -645,7 +617,7 @@ namespace log4net.Appender long currentCount = 0; if (append) { - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { if (System.IO.File.Exists(fileName)) { @@ -661,14 +633,14 @@ namespace log4net.Appender // If not Appending to an existing file we should have rolled the file out of the // way. Therefore we should not be over-writing an existing file. // The only exception is if we are not allowed to roll the existing file away. - if (m_maxSizeRollBackups != 0 && FileExists(fileName)) + if (MaxSizeRollBackups != 0 && FileExists(fileName)) { LogLog.Error(declaringType, "RollingFileAppender: INTERNAL ERROR. Append is False but OutputFile [" + fileName + "] already exists."); } } } - if (!m_staticLogFileName) + if (!StaticLogFileName) { m_scheduledFilename = fileName; } @@ -695,16 +667,16 @@ namespace log4net.Appender /// </remarks> protected string GetNextOutputFileName(string fileName) { - if (!m_staticLogFileName) + if (!StaticLogFileName) { fileName = fileName.Trim(); if (m_rollDate) { - fileName = CombinePath(fileName, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); + fileName = CombinePath(fileName, m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo)); } - if (m_countDirection >= 0) + if (CountDirection >= 0) { fileName = CombinePath(fileName, "." + m_curSizeRollBackups); } @@ -718,22 +690,22 @@ namespace log4net.Appender #region Initialize Options /// <summary> - /// Determines curSizeRollBackups (only within the current roll point) + /// Determines curSizeRollBackups (only within the current roll point) /// </summary> private void DetermineCurSizeRollBackups() { m_curSizeRollBackups = 0; - string fullPath = null; - string fileName = null; + string? fullPath; + string? fileName; - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { - fullPath = Path.GetFullPath(m_baseFileName); + fullPath = Path.GetFullPath(m_baseFileName!); fileName = Path.GetFileName(fullPath); } - var arrayFiles = GetExistingFiles(fullPath); + List<string> arrayFiles = GetExistingFiles(fullPath); InitializeRollBackups(fileName, arrayFiles); LogLog.Debug(declaringType, "curSizeRollBackups starts at [" + m_curSizeRollBackups + "]"); @@ -743,11 +715,9 @@ namespace log4net.Appender /// Generates a wildcard pattern that can be used to find all files /// that are similar to the base file name. /// </summary> - /// <param name="baseFileName"></param> - /// <returns></returns> private string GetWildcardPatternForFile(string baseFileName) { - if (m_preserveLogFileNameExtension) + if (PreserveLogFileNameExtension) { return Path.GetFileNameWithoutExtension(baseFileName) + "*" + Path.GetExtension(baseFileName); } @@ -761,15 +731,13 @@ namespace log4net.Appender /// Builds a list of filenames for all files matching the base filename plus a file /// pattern. /// </summary> - /// <param name="baseFilePath"></param> - /// <returns></returns> - private ArrayList GetExistingFiles(string baseFilePath) + // Internal for unit testing. + internal List<string> GetExistingFiles(string baseFilePath) { - var alFiles = new ArrayList(); - - string directory = null; + var alFiles = new List<string>(); - using (SecurityContext.Impersonate(this)) + string? directory; + using (SecurityContext?.Impersonate(this)) { var fullPath = Path.GetFullPath(baseFilePath); @@ -779,16 +747,12 @@ namespace log4net.Appender var baseFileName = Path.GetFileName(fullPath); var files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName)); - - if (files != null) + for (var i = 0; i < files.Length; i++) { - for (var i = 0; i < files.Length; i++) + var curFileName = Path.GetFileName(files[i]); + if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName))) { - var curFileName = Path.GetFileName(files[i]); - if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName))) - { - alFiles.Add(curFileName); - } + alFiles.Add(curFileName); } } } @@ -802,12 +766,12 @@ namespace log4net.Appender /// </summary> private void RollOverIfDateBoundaryCrossing() { - if (m_staticLogFileName && m_rollDate) + if (StaticLogFileName && m_rollDate) { - if (FileExists(m_baseFileName)) + if (m_baseFileName is not null && FileExists(m_baseFileName)) { DateTime last; - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { if (DateTimeStrategy is UniversalDateTime) { @@ -818,11 +782,11 @@ namespace log4net.Appender last = System.IO.File.GetLastWriteTime(m_baseFileName); } } - LogLog.Debug(declaringType, "[" + last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo) + "] vs. [" + m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo) + "]"); + LogLog.Debug(declaringType, "[" + last.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo) + "] vs. [" + m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo) + "]"); - if (!(last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)))) + if (!(last.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo)))) { - m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo)); LogLog.Debug(declaringType, "Initial roll over to [" + m_scheduledFilename + "]"); RollOverTime(false); LogLog.Debug(declaringType, "curSizeRollBackups after rollOver at [" + m_curSizeRollBackups + "]"); @@ -850,15 +814,15 @@ namespace log4net.Appender RollOverIfDateBoundaryCrossing(); // If file exists and we are not appending then roll it out of the way - if (AppendToFile != false) + if (AppendToFile) { return; } bool fileExists; - var fileName = GetNextOutputFileName(m_baseFileName); + string fileName = GetNextOutputFileName(m_baseFileName!); - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { fileExists = System.IO.File.Exists(fileName); } @@ -868,7 +832,7 @@ namespace log4net.Appender return; } - if (m_maxSizeRollBackups == 0) + if (MaxSizeRollBackups == 0) { LogLog.Debug(declaringType, "Output file [" + fileName + "] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file."); } @@ -900,18 +864,18 @@ namespace log4net.Appender } if (curFileName.Equals(baseFile)) { - // Base log file is not an incremented logfile (.1 or .2, etc) + // Base log file is not an incremented logfile (.1 or .2, etc.) return; } // Only look for files in the current roll point - if (m_rollDate && !m_staticLogFileName) + if (m_rollDate && !StaticLogFileName) { - var date = m_dateTime.Now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).ToLower(); - var prefix = (m_preserveLogFileNameExtension + var date = DateTimeStrategy.Now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo).ToLower(); + var prefix = (PreserveLogFileNameExtension ? Path.GetFileNameWithoutExtension(baseFile) + date : baseFile + date).ToLower(); - var suffix = m_preserveLogFileNameExtension + var suffix = PreserveLogFileNameExtension ? Path.GetExtension(baseFile).ToLower() : ""; if (!curFileName.StartsWith(prefix) || !curFileName.EndsWith(suffix)) @@ -932,11 +896,11 @@ namespace log4net.Appender // we're looking for if (backup > m_curSizeRollBackups) { - if (0 == m_maxSizeRollBackups) + if (0 == MaxSizeRollBackups) { // Stay at zero when zero backups are desired } - else if (-1 == m_maxSizeRollBackups) + else if (-1 == MaxSizeRollBackups) { // Infinite backups, so go as high as the highest value m_curSizeRollBackups = backup; @@ -944,7 +908,7 @@ namespace log4net.Appender else { // Backups limited to a finite number - if (m_countDirection >= 0) + if (CountDirection >= 0) { // Go with the highest file when counting up m_curSizeRollBackups = backup; @@ -952,7 +916,7 @@ namespace log4net.Appender else { // Clip to the limit when counting down - if (backup <= m_maxSizeRollBackups) + if (backup <= MaxSizeRollBackups) { m_curSizeRollBackups = backup; } @@ -976,19 +940,17 @@ namespace log4net.Appender /// <remarks> /// Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. /// </remarks> - /// <param name="curFileName"></param> - /// <returns></returns> private int GetBackUpIndex(string curFileName) { var backUpIndex = -1; var fileName = curFileName; - if (m_preserveLogFileNameExtension) + if (PreserveLogFileNameExtension) { fileName = Path.GetFileNameWithoutExtension(fileName); } - var index = fileName.LastIndexOf("."); + var index = fileName.LastIndexOf(".", StringComparison.Ordinal); if (index > 0) { // if the "yyyy-MM-dd" component of file.log.yyyy-MM-dd is passed to TryParse @@ -1004,18 +966,14 @@ namespace log4net.Appender /// 'incremented' versions of the base file. Bumps the max /// count up to the highest count seen. /// </summary> - /// <param name="baseFile"></param> - /// <param name="arrayFiles"></param> - private void InitializeRollBackups(string baseFile, ArrayList arrayFiles) + // Internal for unit testing. + internal void InitializeRollBackups(string baseFile, List<string> arrayFiles) { - if (null != arrayFiles) - { - var baseFileLower = baseFile.ToLowerInvariant(); + var baseFileLower = baseFile.ToLowerInvariant(); - foreach (string curFileName in arrayFiles) - { - InitializeFromOneFile(baseFileLower, curFileName.ToLowerInvariant()); - } + foreach (string curFileName in arrayFiles) + { + InitializeFromOneFile(baseFileLower, curFileName.ToLowerInvariant()); } } @@ -1032,25 +990,26 @@ namespace log4net.Appender /// and hour then the smallest roll point that can be detected would be /// and hourly roll point as minutes could not be detected. /// </remarks> - private RollPoint ComputeCheckPeriod(string datePattern) + // Internal for unit testing. + internal RollPoint ComputeCheckPeriod(string datePattern) { // s_date1970 is 1970-01-01 00:00:00 this is UniversalSortableDateTimePattern // (based on ISO 8601) using universal time. This date is used for reference // purposes to calculate the resolution of the date pattern. // Get string representation of base line date - var r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo); + string r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo); // Check each type of rolling mode starting with the smallest increment. for (var i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++) { // Get string representation of next pattern - var r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo); + string r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo); LogLog.Debug(declaringType, "Type = [" + i + "], r0 = [" + r0 + "], r1 = [" + r1 + "]"); // Check if the string representations are different - if (r0 != null && r1 != null && !r0.Equals(r1)) + if (!r0.Equals(r1)) { // Found highest precision roll point return (RollPoint)i; @@ -1083,19 +1042,14 @@ namespace log4net.Appender /// </remarks> public override void ActivateOptions() { - if (m_dateTime == null) - { - m_dateTime = new LocalDateTime(); - } - - if (m_rollDate && m_datePattern != null) + if (m_rollDate && DatePattern != null) { - m_now = m_dateTime.Now; - m_rollPoint = ComputeCheckPeriod(m_datePattern); + m_now = DateTimeStrategy.Now; + m_rollPoint = ComputeCheckPeriod(DatePattern); if (m_rollPoint == RollPoint.InvalidRollPoint) { - throw new ArgumentException("Invalid RollPoint, unable to parse [" + m_datePattern + "]"); + throw new ArgumentException("Invalid RollPoint, unable to parse [" + DatePattern + "]"); } // next line added as this removes the name check in rollOver @@ -1109,17 +1063,14 @@ namespace log4net.Appender } } - if (SecurityContext == null) - { - SecurityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); - } + SecurityContext ??= SecurityContextProvider.DefaultProvider.CreateSecurityContext(this); using (SecurityContext.Impersonate(this)) { // Must convert the FileAppender's m_filePath to an absolute path before we // call ExistingInit(). This will be done by the base.ActivateOptions() but // we need to duplicate that functionality here first. - base.File = ConvertToFullPath(base.File.Trim()); + base.File = ConvertToFullPath(base.File!.Trim()); // Store fully qualified base file name m_baseFileName = base.File; @@ -1134,7 +1085,7 @@ namespace log4net.Appender if (m_rollDate && File != null && m_scheduledFilename == null) { - m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(File, m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo)); } ExistingInit(); @@ -1155,9 +1106,9 @@ namespace log4net.Appender private string CombinePath(string path1, string path2) { var extension = Path.GetExtension(path1); - if (m_preserveLogFileNameExtension && extension.Length > 0) + if (PreserveLogFileNameExtension && extension.Length > 0) { - return Path.Combine(Path.GetDirectoryName(path1), Path.GetFileNameWithoutExtension(path1) + path2 + extension); + return Path.Combine(Path.GetDirectoryName(path1) ?? string.Empty, Path.GetFileNameWithoutExtension(path1) + path2 + extension); } else { @@ -1178,10 +1129,10 @@ namespace log4net.Appender /// </remarks> protected void RollOverTime(bool fileIsOpen) { - if (m_staticLogFileName) + if (StaticLogFileName) { // Compute filename, but only if datePattern is specified - if (m_datePattern == null) + if (DatePattern == null) { ErrorHandler.Error("Missing DatePattern option in rollOver()."); return; @@ -1190,11 +1141,11 @@ namespace log4net.Appender //is the new file name equivalent to the 'current' one //something has gone wrong if we hit this -- we should only //roll over if the new file will be different from the old - var dateFormat = m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo); - if (m_scheduledFilename.Equals(CombinePath(File, dateFormat))) + var dateFormat = m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo); + if (string.Equals(m_scheduledFilename, CombinePath(File!, dateFormat))) { - ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File, dateFormat)); - return; + ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File!, dateFormat)); + return; } if (fileIsOpen) @@ -1206,24 +1157,24 @@ namespace log4net.Appender //we may have to roll over a large number of backups here for (var i = 1; i <= m_curSizeRollBackups; i++) { - var from = CombinePath(File, "." + i); - var to = CombinePath(m_scheduledFilename, "." + i); + var from = CombinePath(File!, "." + i); + var to = CombinePath(m_scheduledFilename!, "." + i); RollFile(from, to); } - RollFile(File, m_scheduledFilename); + RollFile(File!, m_scheduledFilename!); } //We've cleared out the old date and are ready for the new m_curSizeRollBackups = 0; //new scheduled name - m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)); + m_scheduledFilename = CombinePath(File!, m_now.ToString(DatePattern, DateTimeFormatInfo.InvariantInfo)); if (fileIsOpen) { // This will also close the file. This is OK since multiple close operations are safe. - SafeOpenFile(m_baseFileName, false); + SafeOpenFile(m_baseFileName!, false); } } @@ -1249,7 +1200,7 @@ namespace log4net.Appender try { LogLog.Debug(declaringType, "Moving [" + fromFile + "] -> [" + toFile + "]"); - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { System.IO.File.Move(fromFile, toFile); } @@ -1277,7 +1228,7 @@ namespace log4net.Appender /// </remarks> protected bool FileExists(string path) { - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { return System.IO.File.Exists(path); } @@ -1289,7 +1240,7 @@ namespace log4net.Appender /// <param name="fileName">The file to delete.</param> /// <remarks> /// <para> - /// Delete a file if is exists. + /// Delete a file if it exists. /// The file is first moved to a new filename then deleted. /// This allows the file to be removed even when it cannot /// be deleted, but it still can be moved. @@ -1308,7 +1259,7 @@ namespace log4net.Appender var tempFileName = fileName + "." + Environment.TickCount + ".DeletePending"; try { - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { System.IO.File.Move(fileName, tempFileName); } @@ -1322,7 +1273,7 @@ namespace log4net.Appender // Try to delete the file (either the original or the moved file) try { - using (SecurityContext.Impersonate(this)) + using (SecurityContext?.Impersonate(this)) { System.IO.File.Delete(fileToDelete); } @@ -1376,19 +1327,22 @@ namespace log4net.Appender CloseFile(); // keep windows happy. LogLog.Debug(declaringType, "rolling over count [" + ((CountingQuietTextWriter)QuietWriter).Count + "]"); - LogLog.Debug(declaringType, "maxSizeRollBackups [" + m_maxSizeRollBackups + "]"); + LogLog.Debug(declaringType, "maxSizeRollBackups [" + MaxSizeRollBackups + "]"); LogLog.Debug(declaringType, "curSizeRollBackups [" + m_curSizeRollBackups + "]"); - LogLog.Debug(declaringType, "countDirection [" + m_countDirection + "]"); + LogLog.Debug(declaringType, "countDirection [" + CountDirection + "]"); - RollOverRenameFiles(File); + if (File is not null) + { + RollOverRenameFiles(File); + } - if (!m_staticLogFileName && m_countDirection >= 0) + if (!StaticLogFileName && CountDirection >= 0) { m_curSizeRollBackups++; } // This will also close the file. This is OK since multiple close operations are safe. - SafeOpenFile(m_baseFileName, false); + SafeOpenFile(m_baseFileName!, false); } /// <summary> @@ -1420,14 +1374,14 @@ namespace log4net.Appender protected void RollOverRenameFiles(string baseFileName) { // If maxBackups <= 0, then there is no file renaming to be done. - if (m_maxSizeRollBackups != 0) + if (MaxSizeRollBackups != 0) { - if (m_countDirection < 0) + if (CountDirection < 0) { // Delete the oldest file, to keep Windows happy. - if (m_curSizeRollBackups == m_maxSizeRollBackups) + if (m_curSizeRollBackups == MaxSizeRollBackups) { - DeleteFile(CombinePath(baseFileName, "." + m_maxSizeRollBackups)); + DeleteFile(CombinePath(baseFileName, "." + MaxSizeRollBackups)); m_curSizeRollBackups--; } @@ -1445,13 +1399,13 @@ namespace log4net.Appender else { //countDirection >= 0 - if (m_curSizeRollBackups >= m_maxSizeRollBackups && m_maxSizeRollBackups > 0) + if (m_curSizeRollBackups >= MaxSizeRollBackups && MaxSizeRollBackups > 0) { //delete the first and keep counting up. - var oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups; + var oldestFileIndex = m_curSizeRollBackups - MaxSizeRollBackups; // If static then there is 1 file without a number, therefore 1 less archive - if (m_staticLogFileName) + if (StaticLogFileName) { oldestFileIndex++; } @@ -1460,13 +1414,13 @@ namespace log4net.Appender // If not using a static log file then the baseFileName will already have a numbered postfix which // we must remove, however it may have a date postfix which we must keep! var archiveFileBaseName = baseFileName; - if (!m_staticLogFileName) + if (!StaticLogFileName) { - if (m_preserveLogFileNameExtension) + if (PreserveLogFileNameExtension) { var extension = Path.GetExtension(archiveFileBaseName); var baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName); - var lastDotIndex = baseName.LastIndexOf("."); + var lastDotIndex = baseName.LastIndexOf(".", StringComparison.Ordinal); if (lastDotIndex >= 0) { archiveFileBaseName = baseName.Substring(0, lastDotIndex) + extension; @@ -1474,7 +1428,7 @@ namespace log4net.Appender } else { - var lastDotIndex = archiveFileBaseName.LastIndexOf("."); + var lastDotIndex = archiveFileBaseName.LastIndexOf(".", StringComparison.Ordinal); if (lastDotIndex >= 0) { archiveFileBaseName = archiveFileBaseName.Substring(0, lastDotIndex); @@ -1486,7 +1440,7 @@ namespace log4net.Appender DeleteFile(CombinePath(archiveFileBaseName, "." + oldestFileIndex)); } - if (m_staticLogFileName) + if (StaticLogFileName) { m_curSizeRollBackups++; RollFile(baseFileName, CombinePath(baseFileName, "." + m_curSizeRollBackups)); @@ -1585,25 +1539,12 @@ namespace log4net.Appender #region Private Instance Fields - /// <summary> - /// This object supplies the current date/time. Allows test code to plug in - /// a method to control this class when testing date/time based rolling. The default - /// implementation uses the underlying value of DateTime.Now. - /// </summary> - private IDateTime m_dateTime = null; - - /// <summary> - /// The date pattern. By default, the pattern is set to <c>".yyyy-MM-dd"</c> - /// meaning daily rollover. - /// </summary> - private string m_datePattern = ".yyyy-MM-dd"; - /// <summary> /// The actual formatted filename that is currently being written to /// or will be the file transferred to on roll over /// (based on staticLogFileName). /// </summary> - private string m_scheduledFilename = null; + private string? m_scheduledFilename; /// <summary> /// The timestamp when we shall next recompute the filename. @@ -1620,25 +1561,10 @@ namespace log4net.Appender /// </summary> private RollPoint m_rollPoint; - /// <summary> - /// The default maximum file size is 10MB - /// </summary> - private long m_maxFileSize = 10 * 1024 * 1024; - - /// <summary> - /// There is zero backup files by default - /// </summary> - private int m_maxSizeRollBackups = 0; - /// <summary> /// How many sized based backups have been made so far /// </summary> - private int m_curSizeRollBackups = 0; - - /// <summary> - /// The rolling file count direction. - /// </summary> - private int m_countDirection = -1; + internal int m_curSizeRollBackups; /// <summary> /// The rolling mode used in this appender. @@ -1655,26 +1581,15 @@ namespace log4net.Appender /// </summary> private bool m_rollSize = true; - /// <summary> - /// Value indicating whether to always log to the same file. - /// </summary> - private bool m_staticLogFileName = true; - - /// <summary> - /// Value indicating whether to preserve the file name extension when rolling. - /// </summary> - private bool m_preserveLogFileNameExtension = false; - - /// <summary> /// FileName provided in configuration. Used for rolling properly /// </summary> - private string m_baseFileName; + private string? m_baseFileName; /// <summary> /// A mutex that is used to lock rolling of files. /// </summary> - private Mutex m_mutexForRolling; + private Mutex? m_mutexForRolling; #endregion Private Instance Fields @@ -1714,7 +1629,7 @@ namespace log4net.Appender /// <summary> /// Default implementation of <see cref="IDateTime"/> that returns the current time. /// </summary> - private class LocalDateTime : IDateTime + private sealed class LocalDateTime : IDateTime { /// <summary> /// Gets the <b>current</b> time. @@ -1734,7 +1649,7 @@ namespace log4net.Appender /// <summary> /// Implementation of <see cref="IDateTime"/> that returns the current time as the coordinated universal time (UTC). /// </summary> - private class UniversalDateTime : IDateTime + private sealed class UniversalDateTime : IDateTime { /// <summary> /// Gets the <b>current</b> time. diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs index 9ebad569..ebe773d1 100644 --- a/src/log4net/Core/LoggingEvent.cs +++ b/src/log4net/Core/LoggingEvent.cs @@ -1479,7 +1479,7 @@ namespace log4net.Core /// <summary> /// The internal logging event data. /// </summary> - private LoggingEventData m_data; + internal LoggingEventData m_data; /// <summary> /// The internal logging event data. diff --git a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs index 23371496..536e11f7 100644 --- a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs +++ b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs @@ -18,13 +18,10 @@ #endregion using System; -using System.Text; using System.IO; -using System.Collections; using log4net.Core; using log4net.Util; -using log4net.Repository; namespace log4net.Layout.Pattern { @@ -97,7 +94,7 @@ namespace log4net.Layout.Pattern /// </summary> /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param> /// <param name="state">The state object on which the pattern converter should be executed.</param> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { LoggingEvent loggingEvent = state as LoggingEvent; if (loggingEvent != null) diff --git a/src/log4net/Util/PatternConverter.cs b/src/log4net/Util/PatternConverter.cs index 7d7c0f74..78864354 100644 --- a/src/log4net/Util/PatternConverter.cs +++ b/src/log4net/Util/PatternConverter.cs @@ -21,7 +21,6 @@ using System.Text; using System.IO; using System.Collections; -using log4net.Util; using log4net.Repository; namespace log4net.Util @@ -129,7 +128,7 @@ namespace log4net.Util /// convert conversion specifiers in the appropriate way. /// </para> /// </remarks> - protected abstract void Convert(TextWriter writer, object state); + protected internal abstract void Convert(TextWriter writer, object state); #endregion Protected Abstract Methods diff --git a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs index 4168df14..574a6da6 100644 --- a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs @@ -17,12 +17,8 @@ // #endregion -using System; -using System.Text; using System.IO; -using log4net.Util; - namespace log4net.Util.PatternStringConverters { /// <summary> @@ -46,7 +42,7 @@ namespace log4net.Util.PatternStringConverters /// Writes name of the current AppDomain to the output <paramref name="writer"/>. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { writer.Write(SystemInfo.ApplicationFriendlyName); } diff --git a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs index 201f3a2a..57592171 100644 --- a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs @@ -86,7 +86,7 @@ namespace log4net.Util.PatternStringConverters /// then all the properties are written as key value pairs. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { if (Option != null) diff --git a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs index 8f77b5fa..cab0f0d5 100644 --- a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs @@ -161,7 +161,7 @@ namespace log4net.Util.PatternStringConverters /// The date and time passed is in the local time zone. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs index f51de82f..7fc52c7d 100644 --- a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs @@ -49,7 +49,7 @@ namespace log4net.Util.PatternStringConverters /// property. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs index c9767f55..423d05e4 100644 --- a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs @@ -48,7 +48,7 @@ namespace log4net.Util.PatternStringConverters /// property. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs index c1d03688..0395e2a0 100644 --- a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs @@ -18,11 +18,8 @@ #endregion using System; -using System.Text; using System.IO; -using log4net.Util; - namespace log4net.Util.PatternStringConverters { /// <summary> @@ -46,7 +43,7 @@ namespace log4net.Util.PatternStringConverters /// Writes the current thread identity to the output <paramref name="writer"/>. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs index c1adfb90..1be955e5 100644 --- a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs @@ -18,11 +18,8 @@ #endregion using System; -using System.Text; using System.IO; -using log4net.Util; - namespace log4net.Util.PatternStringConverters { /// <summary> @@ -99,7 +96,7 @@ namespace log4net.Util.PatternStringConverters /// This method is not used. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { throw new InvalidOperationException("Should never get here because of the overridden Format method"); } diff --git a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs index c9edd675..019037e2 100644 --- a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs @@ -44,7 +44,7 @@ namespace log4net.Util.PatternStringConverters /// </para> /// </remarks> [System.Security.SecuritySafeCritical] - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs index a4c1388b..39bc66c3 100644 --- a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs @@ -57,7 +57,7 @@ namespace log4net.Util.PatternStringConverters /// then all the properties are written as key value pairs. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { CompositeProperties compositeProperties = new CompositeProperties(); diff --git a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs index 0502dfc8..2dffb9ef 100644 --- a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs @@ -18,11 +18,8 @@ #endregion using System; -using System.Text; using System.IO; -using log4net.Util; -using log4net.DateFormatter; using log4net.Core; namespace log4net.Util.PatternStringConverters @@ -104,7 +101,7 @@ namespace log4net.Util.PatternStringConverters /// Write a randoim string to the output <paramref name="writer"/>. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs index 2b6f95b5..8b007cba 100644 --- a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs @@ -43,7 +43,7 @@ namespace log4net.Util.PatternStringConverters /// Write the current threads username to the output <paramref name="writer"/>. /// </para> /// </remarks> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs index 3a044505..3d652639 100644 --- a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs +++ b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs @@ -18,11 +18,8 @@ #endregion using System; -using System.Text; using System.IO; -using log4net.Core; -using log4net.Util; using log4net.DateFormatter; namespace log4net.Util.PatternStringConverters @@ -58,7 +55,7 @@ namespace log4net.Util.PatternStringConverters /// </para> /// </remarks> /// <seealso cref="DatePatternConverter"/> - protected override void Convert(TextWriter writer, object state) + protected internal override void Convert(TextWriter writer, object state) { try { diff --git a/src/log4net/log4net.csproj b/src/log4net/log4net.csproj index d820d7a3..c26bbbb6 100644 --- a/src/log4net/log4net.csproj +++ b/src/log4net/log4net.csproj @@ -22,7 +22,6 @@ <Platforms>AnyCPU</Platforms> <TargetFrameworks>net462;netstandard2.0</TargetFrameworks> <Configurations>Debug;Release</Configurations> - <LangVersion>latest</LangVersion> <RootNamespace>log4net</RootNamespace> <AssemblyName>log4net</AssemblyName> <ProjectType>Local</ProjectType>
