【问题标题】:log4net generates wrong log file name after rolling log fileslog4net 滚动日志文件后生成错误的日志文件名
【发布时间】:2013-12-09 19:14:13
【问题描述】:

基本上我有这个 log4net 的配置:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingFileAppenderWithDeletion" />
  </root>
  <appender name="RollingFileAppenderWithDeletion" type="Namespace.RollingFileAppenderWithDeletion">
    <file type="log4net.Util.PatternString" value="Logs/%property{LogName}/log.%property{ServiceName}-PID-%processid_%date{yyyyMMdd}.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="50MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-5level %date{dd MMM yyyy HH:mm:ss,ffff} [%thread] %exception - %message%newline"/>
    </layout>
  </appender>
</log4net>

现在我有一个问题。每次 log4net 滚动日志文件时,它都不会更改日志文件的日期部分。例如,如果今天的日志文件是-log.MyServiceName-PID-1234_20131208.log,明天滚动文件后,文件名不会改变,所以我最终会得到一个回滚日志像这样的文件和活动日志文件

  1. log.QAService-PID-17584_20131208.log
  2. log.QAService-PID-17584_20131208.log2013Dec08

我想要的是

  1. log.QAService-PID-17584_20131209.log - 活动日志文件
  2. log.QAService-PID-17584_20131208.log2013Dec08 - 回滚

现在我遇到了this post,但这对我没有帮助。特别是,如果我从文件中删除日期模式,并将 preserveLogFileNameExtension 设置为 true,我将无法再看到活动日志文件中的日期部分。如果我进一步将 staticLogFileName 设置为 false,我将不再有活动日志文件,而是活动日志文件具有回滚的日志文件名称模式。

我在这里缺少什么?回滚后如何生成正确的日志文件名。

我正在使用 log4net 版本 1.2.10.0。不幸的是,我无法将其升级到新版本。

更新 这是 RollingFileAppenderWithDeletion 的自定义实现。它只是在日志文件滚动发生后清理旧的回滚文件。

public class RollingFileAppenderWithDeletion :RollingFileAppender
    {
        private IFileBurner m_fileBurner;
        private const int checkMinutes = 1664;
        public RollingFileAppenderWithDeletion()
        {
            m_fileBurner = FileBurner.Instance;

        }

        protected override void AdjustFileBeforeAppend()
        {
            base.AdjustFileBeforeAppend();

            string path = base.File;
            string directoryPath = Path.GetDirectoryName(path);

            IDeletionRequirements requirements = new DeletionRequirements();
            requirements.CheckEveryMinutes = checkMinutes;
            requirements.DayLimit = MaxSizeRollBackups;
            requirements.Directories = new List<string> { directoryPath };

            m_fileBurner.ClearLogFiles(requirements);

        }
    }

【问题讨论】:

    标签: c#-4.0 log4net log4net-configuration log4net-appender


    【解决方案1】:

    您使用的是 Namespace.RollingAppenderWithDeletion 类型,这绝对不是标准的附加程序。尝试使用 log4net.Appender.RollingFileAppender 类型,看看是否有效。当您使用自定义附加程序时,您需要发布一些代码,或者找出未调用文件名代码的原因。

    【讨论】:

    • 您好,感谢您的回复,已编辑帖子。正如您所看到的,在自定义实现中没有什么特别的。它所做的只是清理旧的滚动日志文件。
    • 尝试使用标准来检查日期是否正确。如果是这样,您需要调试 RollingFileAppenderWithDeletion。但是,如果我查看您对 RollingFileAppender 的扩展,我会严重怀疑它是否添加了您想要的功能。尝试附加一个调试器,看看会发生什么。
    • 我将配置更改为 RollingFileAppender,它也不起作用。如果我说 RollingFileAppender 的扩展添加了我想要的功能,是否有助于消除你的疑虑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多