在代码中重命名日志文件后,防止log4net创建新的日志文件

时间:2018-03-18 07:10:07

标签: c# logging log4net

我尝试重命名我的日志文件,将其标记为特定值,以便于组织。例如,应用程序启动时,将创建log_Start.txt。用户访问应用程序中的某个模块后,应将日志文件重命名为log_Start_ModuleName.txt。

但是,log4net不是重命名,而是创建一个名为log_Start_ModuleName.txt的新文件,它留下了2个文件。此外,log_Start.txt中的所有先前日志都不会转移到log_Start_ModuleName.txt。

我已尝试a solution和其他人,但他们似乎最终都创建了一个新的日志文件,而不是重命名它。

这是我在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>

这就是我在代码中重命名文件的方式

    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;
            }
        }
    }

这就是我记录内容的方式:

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!")
     }
}

1 个答案:

答案 0 :(得分:0)

在我看来,你违反了“关注点分离”,因为你混合了两件事。

首先,创建日志数据(通过日志记录语句和滚动文件appender)。 其次,分析/过滤日志数据(搜索模块信息)。

我的暗示,不要这样做。