如何使用log4net配置RollingFileAppender按日期和大小进行滚动?

26
我正在配置log4net使用复合RollingFileAppender,以便当前文件始终被命名为,所有后续文件都被命名为,其中是一天内日志超过一定大小的序列号。不幸的是,我在配置这样的设置方面几乎没有成功。 编辑: 我的当前配置如下所示。 它已根据几个答案进行了更新,足以满足我的需求。 这将生成格式为logfile_YYYY.MM.dd.log.seq的文件。
<log4net>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingFileAppender" />
    </root>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="logs\\logfile"/>
        <staticLogFileName value="false"/>
        <appendToFile value="true"/>
        <rollingStyle value="Composite"/>
        <datePattern value="_yyyy.MM.dd&quot;.log&quot;"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="75KB"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG" />
            <param name="LevelMax" value="FATAL" />
        </filter>
    </appender>

</log4net>

有一个有趣的事实,设置

<staticLogFileName value="false"/>
将to true的值设置为true会导致记录器不写入任何文件。
4个回答

16
我们在Log4J中使用以下内容:
<appender name="roller" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="Applog.log"/>
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n"/>
    </layout>
</appender>

这将给我们提供 Applog.log.yyyy-MM-dd 文件。

1
根据log4j文档:已经观察到DailyRollingFileAppender存在同步问题和数据丢失的情况。log4j extras companion包括替代方案,应考虑用于新部署,并在org.apache.log4j.rolling.RollingFileAppender的文档中进行了讨论。 - Corey Cole

4

根据log4net RollingFileAppender源代码:

protected string GetNextOutputFileName(string fileName)
{
    if (!m_staticLogFileName) 
    {
        fileName = fileName.Trim();

        if (m_rollDate)
        {
            fileName = fileName + m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
        }

        if (m_countDirection >= 0) 
        {
            fileName = fileName + '.' + m_curSizeRollBackups;
        }
    }

    return fileName;
}

所以我猜想你无法生成需要的日志文件名。我认为它应该类似于logfileYYYY-MM-dd.n.log


@Ryan, Leandro:看起来没有简单的方法可以覆盖这种行为。GetNextOutputFileName不是虚函数,而调用它的其他方法引用了私有变量,因此您不能简单地复制它们的代码并替换调用。我认为你能做的最好的事情就是每次使用唯一的文件名,使用类似于你最终使用的日期模式选项的东西。 - Merlyn Morgan-Graham

2

尝试将此属性设置为true:

preserveLogFileNameExtension value="true"

我相信这个技巧会对你有所帮助!但是,preserveLogFileNameExtension属性需要log4net的最新版本,你可以在这里找到它:logging.apache.org/log4net/download.html


1
请注意,在这种情况下
            <maxSizeRollBackups value="10"/>

将被忽略。

请参阅此答案以获取类似log4net问题的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接