0

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

However, instead of renaming, log4net would create a new file called log_Start_ModuleName.txt which leaves me with 2 files. Also, all previous logs in log_Start.txt are not carried over into log_Start_ModuleName.txt.

I've tried a solution and others but they all seem to end up creating a new log file instead of 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 in 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 log stuffs:

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!")
     }
}
John Evans Solachuk
  • 1,953
  • 5
  • 31
  • 67

1 Answers1

0

In my opinion, you violate "separation of concerns" because you mix two things.

First, the creation of log data (via logging statements and a rolling file appender). Second, analysing / filtering log data (searching for module information).

My hint, don't do it this way.