2009-11-10 6 views
12

Ecco la configurazione del mio appender dal mio app.config. Questo stampa semplicemente la stringa letterale invece di tradurla nella data (cioè, stampa letteralmente "[START:% date {MM/gg/aa HH: mm}]").Come utilizzare un modello di data in un'intestazione/piè di pagina?

<appender name="RollingLogFileAppender" 
      type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\somelog" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="-yyyy-MM-dd'.txt'" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <header value="[START: %date{MM/dd/yy HH:mm} ]&#13;&#10;" /> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
    <footer value="[END]&#13;&#10;&#13;&#10;" /> 
    </layout> 
</appender> 

Come posso ottenere questo per stampare la data/ora nell'intestazione?

risposta

14

Un modo semplice per farlo è sottoclasse log4net.Layout.PatternLayout e sovrascrive intestazione e piè di pagina. Quindi è possibile aggiungere quello che vuoi l'intestazione: data, nome della macchina, il nome utente, la versione di montaggio, o qualunque sia il vostro cuore desidera:

using System; 
using log4net.Layout; 

namespace MyAssembly 
{ 
    class MyPatternLayout : PatternLayout 
    { 
     public override string Header 
     { 
      get 
      { 
       var dateString = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); 
       return string.Format("[START: {0} ]\r\n", dateString); 
      } 
     } 
    } 
} 

Includere questa nuova classe nella vostra assemblea, e utilizzare il nuovo tipo di il file, in questo modo:

<layout type="MyAssembly.MyPatternLayout"> 
    <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss} - %message" /> 
</layout> 

Dal momento che escludeva Intestazione e piè di pagina, non avrete nemmeno bisogno di aggiungere qui. L'intestazione verrà aggiunta ogni volta che viene avviata l'applicazione e ogni volta che il file viene spostato.

+0

Avete link ad esempi di sottoclassi della classe PatternLayout? – User

+0

Ho aggiunto un esempio alla risposta per te. – pduncan

+0

C'è un modo per sovrascrivere l'intestazione in modo tale che usi l'attributo value dell'elemento header nella configurazione xml come fa la classe PatternLayout? – User

1

Ho riscontrato questo problema e una soluzione rapida che ho utilizzato è quella di utilizzare solo un'intestazione e un piè di pagina corretti. Poi fare questo, non appena si ha l'oggetto ILOG:

log.Info(string.Format("[START: {0} ]\r\n", dateString))

Così appena sotto l'intestazione si ottengono le informazioni che desideri.

es

===Start=== 
[START: 2012-02-23 12:12:12 ] 

logs... 
17

Risposta da here.

<header value="[BEGIN LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 
<footer value="[END LOGGING AT %date]%newline" type="log4net.Util.PatternString" /> 

Funziona per me come un fascino. Non c'è bisogno di scrivere un pezzo di codice.

anche in progetti che di solito uso:

<header type="log4net.Util.PatternString" value="Our Application Name version %property{Assembly.Version}, .NET version %property{Runtime.Version}, %date ***%newline"/> 

Date un'occhiata a PatternString doc anche.

Inoltre, ho notato che il file di registro non verrà visualizzato finché non si scriverà la prima istruzione del registro.

+0

Ho appena provato questo e sembra che questi modelli siano risolti sia all'avvio che risulta in un piè di pagina con la stessa ora esatta (differenza di 2ms) come nell'intestazione. – sluki

+2

@sluki: usa '' invece di 'PatternLayout' – Wizou

0

Edificio a @Wizou's commento. Vedere la documentazione DynamicPatternLayout Class.

realtà sto usando questa differenza di comportamento per avere un inizio e di fine

Una differenza importante tra PatternLayout e DynamicPatternLayout è il trattamento dei parametri Header e Footer nella configurazione. I parametri Header e Footer per DynamicPatternLayout devono essere sintatticamente sotto forma di PatternString, ma non devono essere contrassegnati come tipo log4net.Util.PatternString. In questo modo, il modello viene convertito staticamente al momento della configurazione e fa sì che DynamicPatternLayout funzioni come PatternLayout.

Impostazione del tipo su Header per stringamodello ma lasciando piè di pagina come dinamica

<layout type="log4net.Layout.DynamicPatternLayout"> <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" type="log4net.Util.PatternString" /> <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> </layout>