Prevent log4net from creating a new log file after renaming the log file in code

I am trying to rename my log files to mark it for a specific value for simpler organizational purposes. For example, when the application starts, log_Start.txt is created. After user access to a specific module in the application, the log file should be renamed as log_Start_ModuleName.txt.

However, instead of renaming, log4net will create a new file called log_Start_ModuleName.txt, which will leave me 2 files. In addition, all previous logs in the log_Start.txt file are not transferred to the log_Start_ModuleName.txt file.

I tried the solution and others, but they all seem to end up creating a new log file, rather than renaming it.

This is my code in App.config:

<log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{dd-MMM-yyyy HH:mm:ss,fff} %level - %message%newline" /> </layout> </appender> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file type="log4net.Util.PatternString" value="D:\Logs\Log_Start.txt" /> <appendToFile value="true" /> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date{dd-MMM-yyyy HH:mm:ss,fff} %level - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="RollingFileAppender" /> </root> </log4net> 

And this is how I rename the file to code

  public void AppendModuleNameToLogFilename(string moduleName) { XmlConfigurator.Configure(); log4net.Repository.ILoggerRepository repo = LogManager.GetRepository(); foreach (log4net.Appender.IAppender a in repo.GetAppenders()) { if (a.Name.CompareTo("RollingFileAppender") == 0 && a is log4net.Appender.RollingFileAppender) { RollingFileAppender fa = (RollingFileAppender)a; fa.File = String.Format("D:\\Logs\\Log_Start_{0}.txt",moduleName); fa.ActivateOptions(); break; } } } 

And this is how I record the material:

 public class ABC{ private static readonly log4net.ILog logMe = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); .... function A(int a) { ... logMe.Info("function A done!") } } 
0
source share
1 answer

In my opinion, you violate the “separation of concerns” because you are mixing two things.

First, the creation of log data (through logging operators and a copied file). Secondly, analysis / filtering of log data (search for information about the module).

My hint, do not do it this way.

0
source

Source: https://habr.com/ru/post/947437/


All Articles