2009-11-10 5 views
12

Hier ist meine appender Konfiguration von meiner app.config. Dies druckt nur den Literalstring aus, anstatt ihn in das Datum zu übersetzen (d. H. Er druckt buchstäblich "[START:% date {MM/TT/JJ HH: mm}]").Wie verwende ich ein Datumsmuster in einer Kopf-/Fußzeile?

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

Wie kann ich das Datum/Uhrzeit in der Kopfzeile drucken?

Antwort

14

Ein einfacher Weg, dies zu tun, ist log4net.Layout.PatternLayout Unterklasse und überschreiben Header und Footer. Dann können Sie addieren, was Sie zu Ihrem Kopf wollen: Datumsstempel, Computernamen, Benutzernamen, Montage-Version, oder was auch immer das Herz begehrt:

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

Fügen Sie diese neue Klasse in der Assembly, und verwenden Sie die neue Art in Ihre Datei, wie folgt aus:

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

Da Sie Kopf- und Fußzeile overrode, Sie brauchen nicht einmal hier hinzufügen. Die Kopfzeile wird jedes Mal hinzugefügt, wenn Ihre Anwendung startet und jedes Mal, wenn die Datei rollt.

+0

Haben Sie Links zu Beispielen für die Pattern Klasse Subklassen? – User

+0

Ich habe ein Beispiel zu der Antwort für Sie hinzugefügt. – pduncan

+0

Gibt es eine Möglichkeit, den Header so zu überschreiben, dass er das value-Attribut des header-Elements in Ihrer xml-Konfiguration verwendet, wie es die PatternLayout-Klasse tut? – User

1

Ich bin auf dieses Problem gestoßen und eine schnelle Abhilfe, die ich verwendet habe, ist nur eine feste Kopf- und Fußzeile verwenden. Dann tun Sie dies, sobald Sie das ILog Objekt haben:

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

So knapp unter dem Header Sie die Informationen erhalten, die Sie wünschen.

Z. B

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

logs... 
17

Antwort von here.

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

Funktioniert für mich wie ein Charme. Keine Notwendigkeit, ein Stück Code zu schreiben.

Auch in Projekten verwenden wir in der Regel: auch

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

Werfen Sie einen Blick auf PatternString doc.

Auch ich habe festgestellt, dass die Protokolldatei nicht angezeigt wird, bis Sie erste Protokollanweisung schreiben.

+0

Ich habe es gerade versucht und es sieht so aus, als ob diese Muster beim Start aufgelöst werden, was zu einer Fußzeile mit genau der gleichen Zeit (2ms Unterschied) wie in der Kopfzeile führt. – sluki

+2

@sluki: Verwenden Sie '' anstelle von 'PatternLayout' – Wizou

0

Aufbauend auf @Wizou's Kommentar. Siehe die DynamicPatternLayout Class Dokumentation.

ich diesen Unterschied im Verhalten tatsächlich unter Verwendung eines Start- und Endzeit

Ein wichtiger Unterschied zwischen Pattern und DynamicPatternLayout zu haben, ist die Behandlung der Kopf- und Fußzeile-Parameter in der Konfiguration. Die Header- und Footer-Parameter für DynamicPatternLayout müssen syntaktisch in Form eines PatternString sein, sollten aber nicht als Typ log4net.Util.PatternString markiert sein. Dies bewirkt, dass das Muster zur Konfigurationszeit statisch konvertiert wird und bewirkt, dass DynamicPatternLayout dasselbe wie PatternLayout ausführt.

Einstellen der Art auf Header PatternString aber verlassen Footer als dynamische

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