是否可以仅在滚动文件的顶部包含标题信息?
我有以下配置文件:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="d:\temp\TTTest.log"/>
<layout type="log4net.Layout.PatternLayout">
<header value="[Header] " />
<param name="ConversionPattern" value="%-25utcdate{dd/MM/yyyy HH:mm:ss.fff}%-20property{log4net:HostName}%-30logger%-30thread%-7level%message%newline"/>
</layout>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<maximumFileSize value="5MB"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="-1"/>
<countDirection value="1"/>
</appender>
当我运行我的应用程序时,例如两次我得到两次标题信息,例如。
[Header]
The Log line
[Header]
The Log line
etc
我希望实现以下目标:
[Header]
The Log line
The Log line
etc
答案 0 :(得分:12)
我发现这样做最简单的方法是创建一个继承自RollingFileAppender的类并像这样覆盖WriteHeader方法:
using System.IO;
using System.Text;
using log4net.Core;
using log4net.Layout;
using log4net.Util;
using log4net.Appender;
namespace CsvLogging
{
public class HeaderOnceAppender : RollingFileAppender
{
protected override void WriteHeader()
{
try
{
if (LockingModel.AcquireLock().Length == 0)
{
base.WriteHeader();
}
}
finally
{
LockingModel.ReleaseLock();
}
}
}
}
然后使用此类作为appender:
<appender name="CsvFileAppender" type="CsvLogging.HeaderOnceAppender">
答案 1 :(得分:3)
创建log4net.Layout.PatternLayout的具体实现:
namespace MyApplication
{
using log4net.Layout;
public class MyConcretePatternLayout : PatternLayout
{
public override string Header => "My Header text here"
}
}
修改log4net.config文件以使用此新的自定义模式布局:
<appender name="MyFileAppender" type="log4net.Appender.RollingFileAppender">
...
<layout type="MyApplication.MyConcretePatternLayout">
<conversionPattern...
</layout>
</appender>
现在,只要文件因您的条件而滚动,您就会看到 &#34;我的标题文字在这里&#34;在每个文件的顶部。
答案 2 :(得分:0)
您需要一个继承自RollingFileAppender的自定义appender。请参阅下面的帖子。
Log4net - How to know when a file is rolled?
基本上,您需要在自定义appender中提供自己的逻辑,以便将标头写入每个新文件。您可能在RollOverSize中执行此操作。获取log4net源代码的副本以供参考是个好主意。