Log4net生成文件的两种规则
前言
最近在设计一个日志采集框架,使用Elastic Stack,FileBant组件部署在工作站上不断的把日志数据推送到logstash,大致的框架是这样的
log4net是什么?
log4net是.Net下最广泛使用的日志采集框架,是java语言下log4j的克隆版
为什么要研究文件生成的规则?
log4net默认的文件生成规则是:假如第一个文件是 test.log,第二个文件生成的时候log4net会把第一个日志文件改成 test.log.0,并生成 test.log,在生成多个文件之后, 目录下有 test.log、test.log.0、test.log.1…test.log.n,并且test.log.n是最早生成的日志文件
那么,问题就来了,FileBeat会无法检测出 test.log 为最新的日志,反而会不断重复发送最旧的日志,这样的效果不是我们想要的,通过翻看log4net的源代码,是可以用过配置参数更改生成日志文件的规则,来实现 test.log.0、test.log.1…test.log.N的文件规则,这个参数就是CountDirection,默认是-1,设置为大于或等于0,即可
RollingFileAppender.cs
/// <summary>
/// Gets or sets the rolling file count direction.
/// </summary>
/// <value>
/// The rolling file count direction.
/// </value>
/// <remarks>
/// <para>
/// Indicates if the current file is the lowest numbered file or the
/// highest numbered file.
/// </para>
/// <para>
/// By default newer files have lower numbers (<see cref="CountDirection" /> < 0),
/// i.e. log.1 is most recent, log.5 is the 5th backup, etc...
/// </para>
/// <para>
/// <see cref="CountDirection" /> >= 0 does the opposite i.e.
/// log.1 is the first backup made, log.5 is the 5th backup made, etc.
/// For infinite backups use <see cref="CountDirection" /> >= 0 to reduce
/// rollover costs.
/// </para>
/// <para>The default file count direction is -1.</para>
/// </remarks>
public int CountDirection
{
get { return m_countDirection; }
set { m_countDirection = value; }
}
对应的 log4net 配置
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="C:\\Log\\" />
<param name="AppendToFile" value="true" />
<!--<param name="MaxFileSize" value="10240" />-->
<param name="maximumFileSize" value="2KB" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<!--CountDirection 默认为-1,将值改为大于0就可以自动递增生成新的文件了-->
<param name="CountDirection" value="1" />
<param name="DatePattern" value="yyyyMM\\yyyyMMdd'.txt'" />
<param name="RollingStyle" value="Composite" />
<!--省略其他配置-->
</appender>
总结
log4net优点功能非常强大,对应的缺点就是配置比较多,我搜索了好久都没查到CountDirection这个参数,还好查看源代码发现了。
另外我拿源代码增加了一个 JsonLaout的类,让log4net支持Json格式输出,链接