仅在滚动文件的顶部包含一次标头

Noe*_*oel 9 c# logging log4net

是否可以仅在滚动文件的顶部包含标题信息?

我有以下配置文件:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="d:\temp\TTTest.log"/>
            <layout type="log4net.Layout.PatternLayout">
                <header value="[Header]&#13;&#10;" />
                <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>
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,例如两次我得到两次标题信息,例如

 [Header] 
 The Log line
 [Header]
 The Log line 
 etc
Run Code Online (Sandbox Code Playgroud)

我期待实现以下目标:

 [Header] 
 The Log line
 The Log line 
 etc
Run Code Online (Sandbox Code Playgroud)

小智 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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用此类作为appender:

<appender name="CsvFileAppender" type="CsvLogging.HeaderOnceAppender">
Run Code Online (Sandbox Code Playgroud)


Jim*_*Jim 0

您需要一个继承自 RollingFileAppender 的自定义附加程序。请参阅下面的帖子。

Log4net - 如何知道文件何时滚动?

基本上,您需要在自定义附加程序中提供自己的逻辑,以将标头写入每个新文件。您可能会在 RollOverSize 中执行此操作。获取 log4net 源代码的副本以供参考是一个好主意。