2013-06-14 14 views
16

Tôi đang sử dụng log4net để ghi nhật ký. Tôi muốn nó ghi vào một tập tin và để eventlog cùng một lúc.Sử dụng log4net để ghi vào nhật ký khác nhau

Vì một lý do nào đó, tôi tìm thấy thư hai lần trong tệp nhật ký của mình.

Đây là tôi app.config-section:

<log4net> 
    <root> 
     <level value="INFO" /> 
     <appender-ref ref="LogFileAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="c:\temp\DIS-logfile.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%date %-5level %logger - %message%newline" /> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="Indigo.DataIntakeService" value="eventlog" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%date %-5level %logger - %message%newline" /> 
      </layout> 
    </appender> 
</log4net> 

Trong mã của tôi, tôi có TOF sau:

private static readonly ILog Log = log4net.LogManager.GetLogger("DataIntakeService"); 
     private static readonly ILog LogEvents = log4net.LogManager.GetLogger("EventLogAppender"); 

     static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
     } 

     public static void LogInfo(string message) 
     { 
      Log.Info(message); 
      LogEvents.Info(message); 
     } 

Nó ghi vào log-file của tôi, theo yêu cầu, nhưng những thông điệp nên cũng đi đến eventviewer của tôi và điều đó không xảy ra. Nó cũng viết những thông điệp đó vào logfile.

Tôi đã gặp sự cố ở đâu?

Trả lời

24

Bạn đã định cấu hình Log4Net sao cho nhật ký gốc ghi nhật ký cho cả người gửi tệp và trình ghi nhật ký sự kiện. Tất cả các logger kế thừa cấu hình này, vì vậy cả logger của bạn "DataIntakeService" và "EventLogAppender" đăng nhập vào các appenders này.

Nếu bạn không thấy thông báo tường trình trong trình xem sự kiện, có thể là do ứng dụng của bạn không có quyền tạo nguồn Sự kiện.

CẬP NHẬT

Làm thế nào tôi có thể cấu hình nó để các bản ghi DataIntakeService đến tập tin và một trong những khác đến eventviewer?

Dưới đây là một cấu hình mẫu:

<log4net> 
    <root> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
    <logger name="EventLogAppender" additivity="False"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <appender> 
    ... 

Với mẫu này:

  • Các logger gốc (và do đó tất cả các logger con trừ khi rõ ràng cấu hình khác) sẽ đăng nhập để LogFileAppender. Trình ghi nhật ký DataIntakeService của bạn không được định cấu hình rõ ràng, vì vậy kế thừa cấu hình này.

  • Trình ghi nhật ký EventLogAppender được cấu hình rõ ràng để đăng nhập EventLogAppender và được định cấu hình không kế thừa cài đặt từ nhật ký phụ huynh (additivity="false"). Do đó, nó không đăng nhập vào LogFileAppender. Nếu bạn đặt additivity="true", nó sẽ kế thừa cài đặt và đăng nhập vào cả hai LogFileAppenderEventLogAppender.

Ngẫu nhiên, đặt tên một logger EventLogAppender có lẽ là một chút bối rối: EventLogLogger có thể là một cái tên hay hơn.

+1

Làm thế nào tôi có thể cấu hình nó để các bản ghi DataIntakeService đến tập tin và một trong những khác đến eventviewer? –

+1

Đây là lời giải thích tốt. Chỉ cần làm rõ, nếu 'additivity' không được chỉ định thì mặc định là' True', đúng không? – Ben

+1

@Ben, vâng, tính cộng dồn mặc định là đúng: https://logging.apache.org/log4net/release/sdk/log4net.Repository.Hierarchy.Logger.Additivity.html – Joe

7

Bạn có thể sử dụng log4net để ghi vào các trình ghi nhật ký khác nhau theo cấu hình bên dưới.

<log4net> 
<logger name="LogFileLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="LogFileAppender" /> 
</logger> 
<logger name="EventLogger"> 
    <level value="INFO" /> 
    <appender-ref ref="EventLogAppender" /> 
</logger> 
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
</appender> 
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
    ... 
</appender> 

Và bạn có thể gọi logger như:

private static readonly log4net.ILog LogFileLogger= log4net.LogManager.GetLogger("LogFileLogger"); 
private static readonly log4net.ILog EventLogger= log4net.LogManager.GetLogger("EventLogger");