【问题标题】:Prevent log4net from creating a new log file after renaming log file in code防止log4net在代码中重命名日志文件后创建新的日志文件
【发布时间】:2018-03-18 07:10:07
【问题描述】:

我正在尝试重命名我的日志文件以将其标记为特定值以便于组织目的。例如,当应用程序启动时,会创建 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!")
     }
}

【问题讨论】:

    标签: c# logging log4net


    【解决方案1】:

    在我看来,您违反了“关注点分离”,因为您将两件事混为一谈。

    首先,创建日志数据(通过日志记录语句和滚动文件附加程序)。 二、分析/过滤日志数据(搜索模块信息)。

    我的提示,不要这样做。

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多