2013-10-16 15 views
5

Tôi muốn mở rộng tệp nhật ký của mình bằng thông tin tĩnh, giống như hệ điều hành phần mềm của tôi đang chạy.log4net GlobalContext.Properties chỉ được đặt một lần

Có cách nào để tiêm thông tin này chỉ một lần cho mỗi tệp được tạo và không cho mỗi mục nhập nhật ký không?

Đây là cách tôi đang làm nó hiện (nhưng kết quả này trong outputting thông tin hơn và hơn nữa - mà isnt cần thiết vì nó thông tin tĩnh)

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> 

hiệu lực thi hành của tôi mong muốn sẽ là một logfile tìm kiếm như thế này :

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

Mã này được sử dụng trong môi trường C# .Net 4.5 WPF.

Hy vọng bạn có thể trợ giúp.

Trả lời

1

Nếu bạn đang sử dụng một RollingFileAppender, hãy xem this question - về cơ bản bạn muốn tạo một lớp kế thừa từ RollingFileAppender và ghi đè phương thức WriteHeader để chỉ ghi tiêu đề một lần cho mỗi tệp.

This answer cho thấy cách tốt nhất để thiết lập thuộc tính Header, bởi subclassing log4net.Layout.PatternLayout

Đưa những với nhau trong một ví dụ:

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

cấu hình Với như thế này (bạn sẽ cần phải đặt tên lắp ráp để những cái đúng):

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

Sau đó, đây là tệp nhật ký kết quả, hoàn chỉnh với tiêu đề:

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

Messages: 
Info Message 
Debug Message 
Etc 
Các vấn đề liên quan