2012-02-07 39 views
25

Tôi đang sử dụng log4net DebugAppender (hoặc TraceAppender). Tôi đã cấu hình appender như thế này:Làm cách nào để dừng cửa sổ Visual Studio Output hiển thị tên logger của đầu ra log4net?

<appender name="DebugAppender" type="log4net.Appender.DebugAppender"> 
    <immediateFlush value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level %message%newline" /> 
    </layout> 
</appender> 

Loggers trong các mã được khai báo trong thông thường mỗi lớp cách:

private static readonly ILog Log = 
    LogManager.GetLogger(typeof(TradingApiRouteCollectionExtensions)); 

Output trong cửa sổ Output trông như thế này:

Acme.Common.Configuration.TradingApiRouteCollectionExtensions: DEBUG Đăng ký tuyến tiền tố 'phiên' cho dịch vụ Acme.Session.SessionService Acme.Common.Configuration.TradingApiRouteCollectionExten sions: phương pháp DEBUG Web tìm thấy cho loại Acme.Session.SessionService: Acme.Common.Configuration.TradingApiRouteCollectionExtensions: phiên DEBUG/

Thông báo như thế nào tất cả các dòng bắt đầu với các loại tên logger. Tôi muốn ngăn chặn điều này vì tôi không yêu cầu nó trong cấu hình và tôi không muốn nó. Tôi không thể nhìn thấy bất kỳ cách rõ ràng để làm điều này. Có thể không?

Trả lời

15

Bạn cần tạo ứng dụng của riêng mình. Người bạn đang sử dụng thực hiện như sau:

System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), loggingEvent.LoggerName); 
if (!this.m_immediateFlush) 
    return; 
System.Diagnostics.Debug.Flush(); 

Vì vậy, bạn luôn kết thúc với tên lớp (nhật ký) trong cửa sổ đầu ra. Bạn có thể lấy được từ trình gỡ lỗi log4net Debug và ghi đè phương thức Append.

+1

Cảm ơn! Đã chỉnh sửa câu trả lời của bạn để thêm vào việc triển khai đầy đủ, bao gồm xử lý xả ngay lập tức. Tôi đã làm như bạn đề nghị với điều này được thêm vào và nó đã làm việc một điều trị. –

9

Hoặc, bạn có thể bắt đầu mẫu chuyển đổi bố cục của mình với %newline. Từ cấu hình của tôi:

<appender name="DebuggerAppender" type="log4net.Appender.DebugAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%newline%file (%line): %level: %message%newline"/> 
     </layout> 
    </appender> 

Ưu: đó là nhanh hơn tạo appender của riêng bạn

Nhược điểm: nó cho thấy bạn đăng nhập vào 2 dòng.

Lưu ý cách %file (%line) ở đầu dòng là định dạng được Visual Studio giải thích. Nó cho phép bạn bấm vào thông điệp tường trình trong cửa sổ đầu ra và được đưa thẳng đến mã đã tạo ra nó.

+1

Lưu ý cuối cùng về việc sử dụng định dạng tệp/dòng của "% tệp (% dòng)" cho phép bạn nhấp vào dòng trong cửa sổ gỡ lỗi và chuyển đến mã tuyệt vời. Một điều cần lưu ý là điều này cần phải là điều đầu tiên trên dòng. – denver

+0

Lưu ý rằng '% file' và'% line' là * đắt tiền * vì chúng sử dụng chức năng StackTrace. Cũng có thể gây hiểu lầm/thiếu trong bản phát hành bản phát hành. –

1

Nếu bạn đọc TraceAppender source code, bạn sẽ thấy thực sự tên nhật ký được ghi là tên "danh mục" mặc định của dấu vết. Vì vậy, nếu bạn đặt giá trị này, tên của trình ghi nhật ký sẽ không được hiển thị trong đầu ra.

Vì vậy, với cấu hình dưới đây:

<appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <category value="" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %level - %message%newline%exception" /> 
    </layout> 
</appender> 

Kết quả sẽ là:

: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

Nhưng bạn có thể thấy rằng tất cả các dòng bắt đầu với ":", mà là xấu xí.Vì vậy, cấu hình của tôi cho loại là:

... 
<category value="LOG" /> 
... 

Và kết quả là:

LOG: 2017-02-27 22:53:26,335 [6] INFO - Task Ended 

LƯU Ý: DebugAppender không cung cấp cách ghi đè lên category. Chỉ TraceAppender hoạt động.

0

Chỉnh sửa của tôi cho câu trả lời đã bị từ chối để cung cấp thêm thông tin hữu ích riêng biệt. Sau đây là cách triển khai hoàn chỉnh sẽ như sau:

public class MyDebugAppender : log4net.Appender.DebugAppender 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); 
     if (ImmediateFlush) 
     { 
      System.Diagnostics.Debug.Flush(); 
     } 
    } 
} 

m_immediateFlush không thể truy cập được trong lớp dẫn xuất, do đó bạn cần sử dụng thuộc tính ImmediateFlush.

Ngoài ra, lưu ý rằng nếu sử dụng tệp log.config, bạn sẽ cần xác định rằng Trình cài đặt của bạn được cung cấp trong một hội đồng mới. (Courtesy of this SO answer.)

<appender name="AppenderRef" type="MyNamespace.MyDebugAppender, MyAppenderAssembly"> 
Các vấn đề liên quan