如何配置 RollingFileAppender 以使用 log4net 按日期和大小滚动?
Posted
技术标签:
【中文标题】如何配置 RollingFileAppender 以使用 log4net 按日期和大小滚动?【英文标题】:How do I configure a RollingFileAppender to roll by date and size with log4net? 【发布时间】:2010-09-19 14:30:25 【问题描述】:我将 log4net 配置为使用复合 RollingFileAppender,以便当前文件始终命名为 logfile.log 并且所有后续文件命名为 logfile-YYYY.MM.dd.seq.log 其中 seq 是日志在一天内超过一定大小时的序列号。不幸的是,我在配置这样的设置方面收效甚微。
编辑:
我当前的配置粘贴在下面。它已经根据几个答案进行了更新,这些答案让我足够接近我的需求。这会生成以下格式的文件: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".log""/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="75KB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%propertyNDC] - %message%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
</log4net>
一个有趣的笔记,设置
<staticLogFileName value="false"/>
为 true 会导致记录器不写入任何文件。
【问题讨论】:
【参考方案1】:我们使用以下(在 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]%dDATE[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 文件
【讨论】:
根据 log4j 文档:已观察到 DailyRollingFileAppender 出现同步问题和数据丢失。 log4j extras 伴侣包括新部署应考虑的替代方案,并在 org.apache.log4j.rolling.RollingFileAppender 的文档中进行了讨论。【参考方案2】:根据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
不是虚拟的,其他调用它的方法引用私有变量,所以你不能简单地复制它们的代码,并替换调用。我认为你能做的最好的就是每次都有一个唯一的文件名,使用你最终使用的日期模式选项。【参考方案3】:
尝试将此属性设置为 true:
preserveLogFileNameExtension value="true"
我相信这个技巧会对你有所帮助!但是,preserveLogFileNameExtension 属性需要最新版本的 log4net,你可以在这里找到它:logging.apache.org/log4net/download.html
【讨论】:
【参考方案4】:注意是这种情况
<maxSizeRollBackups value="10"/>
将被忽略。
查看此answer 到类似的 log4net 问题
【讨论】:
以上是关于如何配置 RollingFileAppender 以使用 log4net 按日期和大小滚动?的主要内容,如果未能解决你的问题,请参考以下文章
Apache Flink RollingFileAppender
log4j RollingFileAppender 创建的日志文件的权限
logback fileappende和rollingfileappender有啥区别