2009-03-16 7 views
58

Tôi có một chương trình thực hiện nhiều cuộc gọi log4net tới nhật ký "myprogram". Nó cũng gọi mã khác mà làm cho cuộc gọi log4net để logger khác. Tôi muốn chụp tất cả nhật ký cao hơn INFO cho "myprogram" và tất cả nhật ký cao hơn WARN cho mọi thứ khác. Bằng cách này, tôi nhận được các thông báo đang hoạt động cụ thể cho công việc tôi đang làm, nhưng vẫn được thông báo về những điều có thể xảy ra trong mã hỗ trợ. Tôi muốn điều này được gửi đến cả Bàn điều khiển và tệp nhật ký.Loại bỏ đăng nhập trùng lặp trong log4net

Tôi có cấu hình log4net sau:

<log4net> 
    <root> 
     <level value="WARN" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </root> 
    <logger name="myprogram"> 
     <level value="INFO" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </logger> 
    <appender name="Console" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message%newline" /> 
     </layout> 
     <threshold value="INFO" /> 
    </appender> 
    <appender name="LogFile" type="log4net.Appender.RollingFileAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" /> 
     </layout> 
     <appendToFile value="false" /> 
     <staticLogFileName value="true" /> 
     <rollingStyle value="Once" /> 
     <file value="mylogfile" /> 
     <immediateFlush value="true" /> 
     <threshold value="INFO" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    </appender> 
</log4net> 

Điều này làm cho cảm giác hoàn hảo với tôi: đăng nhập> WARN cho tất cả mọi thứ và> INFO cho cụ "myprogram" logger.

Vấn đề là tôi nhận được thông báo INFO được ghi lại hai lần trên cả Bảng điều khiển và LogFile. Điều này chỉ xảy ra nếu tôi có đầy đủ các thành phần <root><logger>; nếu tôi xóa một trong hai, thì cái còn lại hoạt động như tôi mong đợi.

Tôi có thể hiểu được liệu tôi có đang ghi nhật ký các mục WARN hay không (nhưng chương trình của tôi khớp với cả "root" và "myprogram"), nhưng nó xảy ra tại INFO mặc dù ROOT (có lẽ) được đặt thành WARN.

Tôi có làm gì sai ở đây hay đây là lỗi log4net/mơ hồ không?

Trả lời

72

Bạn đang bị trùng lặp vì bạn đang yêu cầu ghi nhật ký hai lần. Tôi sẽ không khuyên bạn sử dụng additivity đây kể từ khi bạn có thể gặp một số tác dụng phụ, chỉ cần loại bỏ cấu hình không cần thiết:

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram"> 
    <level value="INFO" /> 
</logger> 

Bạn không cần phải chỉ ra appender-ref trong myprogram logger vì nó sẽ thừa kế chúng từ root logger; nếu bạn chỉ định chúng một lần nữa nó sẽ đăng nhập hai lần.

+0

Điều này làm việc tốt cho tôi khi tôi gặp phải vấn đề tương tự. Điều này tránh được vấn đề về độ nhạy cũng như –

+1

Đây là câu trả lời đúng. Logger thừa hưởng appenders từ root. Cảm ơn! –

+1

@ Jeffrey bạn có biết những vấn đề gì với việc sử dụng độ nhạy không? Tôi đã không thành công trong việc tìm kiếm bất kỳ tài liệu nào mà Google biết. – Tinister

67

Hãy thử với thay đổi này, đặt mức độ cộng thành sai.

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</logger> 
+1

Điều đó đã xảy ra; Cảm ơn nhiều lắm. –

+2

Đây là một cách hay để đảm bảo tất cả các thư được ghi lại đối với nhật ký 'myprogram' không bị bong bóng lên trình ghi nhật ký gốc. – Llyle

+0

Cảm ơn điều này đã giải quyết được vấn đề tôi đã googling. – Kugel