2013-10-16 14 views
5

Desidero estendere il mio file di registro con informazioni statiche, ad esempio quale sistema operativo è in esecuzione il mio software.log4net GlobalContext.Properties impostato solo una volta

C'è un modo per iniettare queste informazioni solo una volta per file che è stato creato e non per ogni voce di registro?

Questo è come mi sto facendo attualmente (ma questo si traduce in output le informazioni più e più volte - che costerà necessaria dal momento che le informazioni statiche)

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> 

mio effetto desiderato sarebbe un file di log alla ricerca come questo :

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

Questo codice viene utilizzato in un ambiente C# .Net 4.5 WPF.

Spero che tu possa aiutare.

risposta

1

Se stai usando un RollingFileAppender, un'occhiata a this question - essenzialmente si desidera creare una classe che eredita da RollingFileAppender e l'override del metodo WriteHeader di scrivere solo l'intestazione una volta per ogni file.

This answer mostra il modo migliore per impostare la proprietà Header, da sottoclasse log4net.Layout.PatternLayout

mettere quelle insieme in un esempio:

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

config Dato come questo (si avrebbe bisogno di impostare i nomi di assemblaggio a quelli corretti):

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

allora questo è il file di log risultante, completo di intestazione:

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

Messages: 
Info Message 
Debug Message 
Etc