强制log4net覆盖文件

本文关键字:文件 覆盖 log4net 强制 | 更新日期: 2023-09-27 18:11:23

我开发了一个应用程序,每次运行几次都会做一些事情。

我在每次运行中获得了很多日志信息。因此,当运行成功(没有抛出异常),并且用户开始新运行时,我想覆盖启动新运行时的日志文件。

我怎么才能做到呢?

进一步:如何从Logger接口中获取日志文件名?我不想解析App.xaml.cs

强制log4net覆盖文件

要覆盖日志文件,请使用FileAppender并将appendToFile设置为false:

appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="log.txt" />
    <appendToFile value="false" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] .. etc ..  />
    </layout>
</appender>

但是,这将无法知道您的运行是否成功,并且会在每次运行应用程序时覆盖该文件。

解决方案是:

public static void StartNewLogFile()
{
    Hierarchy hierachy = (Hierarchy)log4net.LogManager.GetRepository();
    Logger logger = hierachy.Root;
    var rootAppender = logger.Appenders.OfType<FileAppender>().FirstOrDefault();
    string filename = rootAppender != null ? rootAppender.File : string.Empty;
    while (logger != null)
    {
        foreach (IAppender appender in logger.Appenders)
        {
            FileAppender fileAppender = appender as FileAppender;
            if (fileAppender != null)
            {
                fileAppender.File = filename + "a";
                fileAppender.File = filename;
                fileAppender.ActivateOptions();
            }
        }
        logger = logger.Parent;
    }
    File.Delete(filename + "a");
}

与一个很大的帮助:编程强制一个新的日志文件与Log4Net