2010-09-07 9 views
19

Tôi hiện có nhiều tệp nhật ký trong ứng dụng của mình bằng cách sử dụng log4net.Log4Net - Chỉ đăng xuất stacktrace ngoại lệ cho một số tệp nhất định

Tôi có tệp nhật ký cấp cao nhất chứa mọi loại thư. Tôi cũng có tệp nhật ký lỗi chỉ chứa thông tin lỗi. Tôi đang cố gắng cấu hình nó để các chi tiết ngoại lệ cụ thể và theo dõi ngăn xếp chỉ xuất hiện trong tệp nhật ký lỗi.

Cuộc gọi tôi đang sử dụng là Log.Error(myMessage, myException);

cấu hình của tôi có thể được nhìn thấy dưới đây:

<configuration> 
    <log4net> 

    <root> 
    <level value="ALL"/> 
    <appender-ref ref="GeneralTextLog"/> 
    <appender-ref ref="ErrorTextLog"/> 
    </root> 

<!-- The general appender rolls by date --> 
<appender name="GeneralTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <level value="ALL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%n"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/General_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- The Error appender rolls by date --> 
<appender name="ErrorTextLog" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
    </filter> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%type] %-5p %message%newline%exception"/> 
    </layout> 
    <rollingStyle value="Date"/> 
    <file value="C:/Logs/Error_"/> 
    <datePattern value="yyyy_MM_dd'.log'" /> 
    <appendToFile value="true"/> 
    <staticLogFileName value="false"/> 
</appender> 

<!-- Loggers --> 
<logger name="DefaultLogger"> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</logger> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 

Mặc dù thực tế mà tôi đã chỉ bao gồm% ngoại lệ trong conversionPattern đối với nhật ký lỗi, stacktrace xuất hiện trong cả hai nhật ký. Có ai biết làm thế nào tôi có thể ngăn chặn điều này xảy ra?

Trả lời

37

Configure cách bố trí như thế này (GeneralTextLog appender):

<layout type="log4net.Layout.PatternLayout"> 
    <IgnoresException value="False" /> 
    ... 

Thiết IgnoresException false kể appender rằng việc bố trí sẽ chăm sóc sự ngoại lệ. Do đó bạn có thể chọn không in dấu vết ngăn xếp.

+0

Điều này đã hiệu quả. Cảm ơn bạn. – Rob

0

Từ cấu hình của bạn, có vẻ như dấu vết ngăn xếp của bạn được bao gồm như một phần của thông số message.

EDIT - Tôi phải rõ ràng hơn. Tôi đoán là khi bạn gọi phương thức ghi nhật ký của log4net, tham số đầu tiên của bạn (là message) chứa dấu vết ngăn xếp, nhưng đó chỉ là phỏng đoán. Đây cũng là thông số duy nhất trong cả hai ứng dụng của bạn. Nếu bạn không có tham số trong định dạng người gắn thêm của mình, thông số đó sẽ không xuất hiện trong cả hai nhật ký ... trừ khi ứng dụng của bạn có ngoại lệ là người phụ trách chính.

Hãy thử này để thay thế và xem những gì sẽ xảy ra:

<!-- Loggers --> 
<root> 
    <appender-ref ref="GeneralTextLog"/> 
    <level value="ALL"/> 
</root> 

<logger name="ErrorLogger"> 
    <appender-ref ref="ErrorTextLog"/> 
    <levelMin value="WARN"/> 
    <levelMax value="FATAL"/> 
</logger> 
+0

Dấu vết ngăn xếp không được chứa trong thông báo 'paramater' đầu tiên. Thông điệp là một chuỗi văn bản đơn giản của "Lỗi", với ngoại lệ được truyền vào làm tham số thứ hai. Thay đổi nó thành cấu hình ở trên đã làm cho nó để mục nhật ký chỉ xuất hiện trong một trong các tệp (generalTextLog), vẫn còn với dấu vết ngăn xếp. – Rob

+0

@Rob được rồi, cảm ơn vì đã cho tôi biết. Tôi chưa từng sử dụng "TẤT CẢ" trước đây trong cấu hình của mình, chỉ "DEBUG" hoặc một phạm vi cụ thể. Điều duy nhất tôi có thể đoán là TẤT CẢ có thể chịu trách nhiệm, nhưng không có bất kỳ tài liệu nào cho giá trị tham số này. Hãy thử DEBUG thay thế. Nhân tiện, bạn đang gọi phương thức nào để thực hiện việc ghi nhật ký này? Tôi đoán đó là logger.Debug() vì nó không xuất hiện trong ErrorLogger? – Dave

+0

@Rob xin lỗi, đọc hiểu đã thất bại tôi. Tôi thấy bạn đang sử dụng Error(). – Dave