2012-06-26 10 views
7

È possibile includere solo le informazioni dell'intestazione nella parte superiore di un file a rotazione?Includi intestazione solo una volta nella parte superiore di un file a rotazione

Ho la seguente file di configurazione:

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

Quando eseguo la mia applicazione, per esempio due volte ricevo informazioni di intestazione due volte per esempio

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

Sto cercando di raggiungere i seguenti obiettivi:

[Header] 
The Log line 
The Log line 
etc 

risposta

0

Hai bisogno di un appender personalizzato che eredita da RollingFileAppender. Vedi il post qui sotto.

Log4net - How to know when a file is rolled?

In sostanza, è necessario fornire la propria logica nel appender personalizzato di scrivere l'intestazione di ogni nuovo file. Probabilmente lo farai in RollOverSize. Sarebbe una buona idea ottenere una copia del codice sorgente di log4net come riferimento.

10

Il modo più semplice che ho trovato per farlo è quello di creare una classe che eredita da RollingFileAppender e sovrascrive in questo modo il metodo 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(); 
      } 
     } 
    } 
} 

quindi utilizzare questa classe come appender:

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

Avevo bisogno di aggiungere l'assembly anche per il tipo, poiché log4net non sapeva dove cercare bigfoot

3

Creare una concreta attuazione del log4net.Layout.PatternLayout:

namespace MyApplication 
{ 
    using log4net.Layout; 

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

Modificare il file log4net.config di utilizzare questo nuovo modello di layout personalizzato:

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

    </appender> 

Ora ogni volta che i rotoli di file a causa di tuoi criteri si dovrebbe vedere "La mia intestazione testo qui" nella parte superiore di ogni file.

Problemi correlati