2009-11-10 14 views
12

Voici la configuration de mon appender à partir de mon app.config. Cela imprime simplement la chaîne littérale au lieu de la traduire à la date (c'est-à-dire qu'elle imprime littéralement "[START:% date {MM/jj/aa HH: mm}]").Comment utiliser un modèle de date dans un en-tête/pied de page?

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

Comment est-ce que je peux obtenir ceci pour imprimer la date/heure dans l'en-tête?

Répondre

14

Un moyen facile de faire ceci est de sous-classer log4net.Layout.PatternLayout et de surcharger l'en-tête et le pied de page. Ensuite, vous pouvez ajouter ce que vous voulez à votre tête: timbre date, le nom de la machine, le nom d'utilisateur, la version de montage, ou quel que soit votre coeur désire:

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); 
      } 
     } 
    } 
} 

Inclure cette nouvelle classe dans votre assemblée, et utiliser le nouveau type de votre fichier, comme ceci:

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

Puisque vous-tête et pied redéfini, vous ne même pas besoin d'ajouter ici. L'en-tête sera ajouté chaque fois que votre application démarre et chaque fois que le fichier est transféré.

+0

Avez-vous des liens vers des exemples de sous-classement de la classe PatternLayout? – User

+0

J'ai ajouté un exemple à la réponse pour vous. – pduncan

+0

Existe-t-il un moyen de remplacer l'en-tête de telle sorte qu'il utilise l'attribut value de l'élément d'en-tête dans votre configuration XML comme le fait la classe PatternLayout? – User

1

J'ai rencontré ce problème et une solution de contournement rapide que j'ai utilisée est d'utiliser simplement un en-tête et un pied de page fixes. Ensuite, faites ce que dès que vous avez l'objet ILog:

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

donc juste sous l'en-tête, vous obtiendrez les informations que vous désirez.

par exemple

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

logs... 

17

Réponse de here.

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

Fonctionne pour moi comme un charme. Pas besoin d'écrire un morceau de code.

dans les projets que nous utilisons habituellement aussi:

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

Jetez un oeil à PatternString doc aussi.

J'ai également remarqué que le fichier journal n'apparaîtra pas tant que vous n'aurez pas écrit la première instruction de journal.

+0

J'ai juste essayé ceci et il semble que ces modèles soient résolus au démarrage, ce qui donne un pied de page avec exactement le même temps (différence de 2 ms) que dans l'en-tête. – sluki

+2

@sluki: Utilisez '' au lieu de 'PatternLayout' – Wizou

0

En se basant sur @Wizou's commentaire. Voir la documentation DynamicPatternLayout Class.

J'utilise en fait cette différence de comportement pour avoir un temps de début et de fin

Une différence importante entre PatternLayout et DynamicPatternLayout est le traitement des paramètres tête et de pied dans la configuration. Les paramètres Header et Footer pour DynamicPatternLayout doivent être syntaxiquement sous forme de PatternString, mais ne doivent pas être marqués comme type log4net.Util.PatternString. Cela entraîne la conversion statique du motif au moment de la configuration et l'exécution de DynamicPatternLayout de la même manière que PatternLayout.

Réglage du type de tête à chaîne_métacaractères mais en laissant pied aussi dynamique

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