2013-07-29 28 views
5

Tôi đang sử dụng log4net để đăng nhập một dự án.Tạo một thể hiện log4net.ILog khác cho mỗi ứng dụng

Tôi muốn đăng nhập vào 3 tệp khác nhau: yêu cầu, phản hồi và lỗi.

<log4net debug="true"> 
    <!--To turn off an appender, simply set it's threshold value to "OFF"--> 
    <appender type="log4net.Appender.RollingFileAppender" name="RequestAppender"> 
     <file value="requests.txt" /> 
     <threshold value="INFO" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

    <appender type="log4net.Appender.RollingFileAppender" name="ResponseAppender"> 
     <file value="responses.txt" /> 
     <threshold value="INFO" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

    <appender type="log4net.Appender.RollingFileAppender" name="ErrorAppender"> 
     <file value="errors.txt" /> 
     <threshold value="ERROR" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

</log4net> 

Tuy nhiên, tôi không biết cách lấy ví dụ cho mỗi trình ghi nhật ký ở phía .NET. Với standrard, 1 appender cấu hình, tôi sử dụng để sau:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

Nhưng điều này không xác định appenderName, và tôi đã không tìm thấy một cách để xác định nó.

Bất kỳ ý tưởng nào?

Cảm ơn!

EDIT: Tôi nghĩ rằng tôi thiếu một số thứ như tôi không có định nghĩa trong tệp cấu hình của mình. Tôi không hiểu sự tách biệt giữa các logger và appenders.

EDIT # 2: Tôi nhận thấy điều gì đó kỳ lạ. Trước khi cấu hình nhiều logger 3 tôi đã có một cấu hình 1 logger. Bây giờ, các bài viết tôi viết vào 3 logger ghi vào tập tin đăng nhập đó, mặc dù nó không còn trong tập tin cấu hình. Vì một số lý do, nó không tải tập tin cấu hình mới. Làm thế nào tôi có thể buộc nó làm như vậy?

+0

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files – Microtechie

+0

Tôi cũng nghĩ như vậy và cú pháp có vẻ ổn, nhưng nó không hoạt động. Nó biên dịch và chạy tốt. Tuy nhiên, tất cả các thành viên isLevelEnabled của tất cả các logger được đặt thành TRUE mặc dù đó không phải là cách chúng được thiết lập, và các bản ghi kiểm tra mà tôi đã viết không được ghi lại. – Niv

+0

Hãy thử điều này - [link] (http://stackoverflow.com/questions/308436/log4net-programmatically-specify-multiple-loggers-with-multiple-file-appenders) – Nilesh

Trả lời

2

Để sử dụng tên bạn muốn, bạn có thể thực hiện 3 logger:

private static readonly log4net.ILog logError = log4net.LogManager.GetLogger("ErrorAppender"); 
private static readonly log4net.ILog logResponse = log4net.LogManager.GetLogger("ResponseAppender"); 
private static readonly log4net.ILog logRequest = log4net.LogManager.GetLogger("RequestAppender"); 

Khi đăng nhập một thông điệp đăng nhập bạn phải sử dụng các logger chính xác. Trình cài đặt của bạn được định cấu hình để xử lý từng trình ghi nhật ký trong một tệp riêng biệt.

Vấn đề với mã hiện tại của bạn là:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

Bởi vì bạn sử dụng logger tĩnh tên logger có thể có lẽ không hình thành một cách chính xác. Không có System.Reflection.MethodBase.GetCurrentMethod() bởi vì khi sự kích thích tĩnh được gọi là không có GetCurrentMethod. Bạn có thể thay đổi điều đó thành typeof(..).Name. Tuy nhiên, bạn cần phải cấu hình lại các trình bổ sung để đăng nhập tên lớp của mình.

+0

Tôi có 2 câu hỏi: 1) Sau khi đọc bit, tôi nhận thấy tôi đã không xác định một yếu tố trong cấu hình của tôi. Tôi có nên định nghĩa một với không? 2) Bây giờ tôi nhận thấy, bằng cách sử dụng debug nội bộ log4net, tập tin cấu hình mới của tôi không mất chút nào - nó vẫn sử dụng cấu hình cũ! Tất cả các văn bản tôi làm với logError, logResponse, logRequest được gửi như thể chúng được gửi bằng cách sử dụng logger cũ mà tôi đã có (chúng được ghi vào tệp log.txt mà tôi đã sử dụng trước đó). Tôi đã thử làm sạch dự án của mình và nó vẫn không hoạt động. – Niv

+1

Chỉ cần một lưu ý, 'System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType' không hoạt động trong ngữ cảnh này ... nó là evaluationg đối với kiểu của lớp logger được khai báo bên trong. Vì vậy, bạn đang kết thúc với một tên logger như 'MyCorp.MyClass' thay vì' ErrorAppender' như bạn muốn. –

Các vấn đề liên quan