Include header only once at the top of a rolling file
c#, log4net, logging
Solution
The easiest way I've found to do this is to create a class that inherits from RollingFileAppender and overwrites like this the WriteHeader method :
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();
}
}
}
}
then use this class as appender :
<appender name="CsvFileAppender" type="CsvLogging.HeaderOnceAppender">
Problem
Is it possible to only include header information at the top of a rolling file? I have the following config file: ``` <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> ``` When I run my application, for example twice I get header information twice e.g. ``` [Header] The Log line [Header] The Log line etc ``` I am looking to achieve the following: ``` [Header] The Log line The Log line etc ```