2013-10-16 4 views
5

Ich möchte meine Protokolldatei mit statischen Informationen erweitern, z. B. welches Betriebssystem meine Software ausführt.log4net GlobalContext.Properties nur einmal gesetzt

Gibt es eine Möglichkeit, diese Informationen nur einmal pro Datei einzufügen, die erstellt wurde und nicht für jeden Protokolleintrag?

Dies ist, wie ich es zur Zeit tue (dies führt jedoch die Informationen immer und immer wieder in die Ausgabe - die statische Informationen, da es notwendig ist nicht)

GlobalContext.Properties["**evInfoOsPlatform**"] = string.Format("OS Platform: {0}", Environment.OSVersion.Platform); 

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{ABSOLUTE} [%thread] %level 
         %logger - %message%newlineOperating System Version: %property{ 
         **evInfoOsPlatform**}%newline%exception"/> 
</layout> 

Mein gewünschten Effekt wäre ein Logfile wie folgt aussehen :

Static information: 
OS Version: Windows 8.1.0101934 32-bit 
Culture Info: en-US 
Domainname: RandomDomain 
Username: Emil 
Userrights: Admin  

Messages: 
//now all the messages should be printed... 

Dieser Code wird in einer C# .Net 4.5 WPF-Umgebung verwendet.

Ich hoffe, Sie können helfen.

Antwort

1

Wenn Sie eine RollingFileAppender verwenden, werfen Sie einen Blick auf this question - im Wesentlichen eine Klasse erstellen möchten, die von RollingFileAppender erbt und überschreiben die WriteHeader Methode, um nur den Header einmal für jede Datei zu schreiben.

This answer zeigt die beste Weg, um die Header-Eigenschaft zu setzen, von log4net.Layout.PatternLayout

diejenigen zusammen in einem Beispiel Subklassen Putting:

namespace MyAssembly.log4net.Header.Example 
{ 
    public class HeaderAppender : RollingFileAppender 
    { 
     protected override void WriteHeader() 
     { 
      if (LockingModel.AcquireLock().Length == 0) 
      { 
       base.WriteHeader(); 
      } 
     } 
    } 

    public class HeaderPatternLayout : PatternLayout 
    { 
     public override string Header 
     { 
      get 
      { 
       StringBuilder headerBuilder = new StringBuilder(); 
       headerBuilder.AppendLine("Static information"); 
       headerBuilder.AppendLine("OS Version: " 
          + Environment.OSVersion); 
       headerBuilder.AppendLine("Culture Info: " 
          + CultureInfo.CurrentCulture); 
       headerBuilder.AppendLine("[Etc] "); 
       headerBuilder.AppendLine(); 
       headerBuilder.AppendLine("Messages:");  

       return headerBuilder.ToString(); 
      } 
     } 
    } 
} 

angegebenen Konfiguration wie folgt aus (Sie würden die Montage Namen festlegen müssen, um die richtige ist):

<configuration> 
    <configSections> 
    <section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net debug="false"> 

    <appender name="HeaderAppender" 
       type="MyAssembly.log4net.Header.Example.HeaderAppender,MyAssembly"> 
     <file value="c:\temp\Test.log"/> 
     <layout 
     type="MyAssembly.log4net.Header.Example.HeaderPatternLayout,MyAssembly"> 
     <conversionPattern value="%message%newline" /> 
     </layout> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/> 
     <maximumFileSize value="5MB"/> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="-1"/> 
     <countDirection value="1"/> 
    </appender> 

    <root> 
     <level value="ALL" /> 
     <appender-ref ref="HeaderAppender" /> 
    </root> 

    </log4net> 

</configuration> 

Dann ist dies die resultierende Protokolldatei, komplett mit Kopf:

Static information 
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1 
Culture Info: en-GB 
[Etc] 

Messages: 
Info Message 
Debug Message 
Etc