2012-06-26 18 views
7

¿Es posible incluir solo la información del encabezado en la parte superior de un archivo continuo?Incluir encabezado solo una vez en la parte superior de un archivo continuo

tengo el siguiente fichero de configuración:

<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> 

Cuando ejecuto mi aplicación, por ejemplo, dos veces consigo la información del encabezado en dos ocasiones, por ejemplo,

[Header] 
The Log line 
[Header] 
The Log line 
etc 

Miro para lograr lo siguiente:

[Header] 
The Log line 
The Log line 
etc 

Respuesta

0

Se necesita un appender personalizado que hereda de RollingFileAppender. Ver la publicación a continuación.

Log4net - How to know when a file is rolled?

Básicamente, tiene que proporcionar su propia lógica en el appender encargo de escribir su cabecera a cada nuevo archivo. Probablemente harías esto en RollOverSize. Sería una buena idea obtener una copia del código fuente de log4net para referencia.

10

La manera más fácil que he encontrado para hacer esto es crear una clase que hereda de RollingFileAppender y sobrescribe así el método 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() 
     { 
      if (LockingModel.AcquireLock().Length == 0) 
      { 
       base.WriteHeader(); 
      } 
     } 
    } 
} 

a continuación, utilizar esta clase como appender:

<appender name="CsvFileAppender" type="CsvLogging.HeaderOnceAppender"> 
+0

Necesitaba agregar también el ensamblado para el tipo, ya que log4net no sabía dónde mirar bigfoot

3

Crear una aplicación concreta de la log4net.Layout.PatternLayout:

namespace MyApplication 
{ 
    using log4net.Layout; 

    public class MyConcretePatternLayout : PatternLayout 
    { 
     public override string Header => "My Header text here" 
    } 
} 

modificar su archivo log4net.config a utilizar este nuevo diseño de patrón personalizado:

<appender name="MyFileAppender" type="log4net.Appender.RollingFileAppender"> 
     ... 
     <layout type="MyApplication.MyConcretePatternLayout"> 
     <conversionPattern... 
     </layout> 

    </appender> 

Ahora cada vez que los rollos de archivos debido a los criterios que deben ver "Mi texto del encabezado aquí" en la parte superior de cada archivo.

Cuestiones relacionadas