2010-03-16 32 views
7

Tôi đã tạo một ứng dụng tùy chỉnh log4net. Nó xuống từ log4net.Appender.SmtpAppender mà xuống từ log4net.Appender.BufferingAppenderSkeleton.Tại sao bộ đệm ứng dụng của tôi không phải là bộ đệm log4?

tôi programatically thiết lập các thông số sau trong constructor của nó:

this.Lossy = false; //don't drop any messages 
this.BufferSize = 3; //buffer up to 3 messages 
this.Threshold = log4net.Core.Level.Error; //append messages of Error or higher 
this.Evaluator = new log4net.Core.LevelEvaluator(Level.Off); //don't flush the buffer for any message, regardless of level 

Tôi hy vọng điều này sẽ đệm 3 sự kiện của mức Lỗi hoặc cao hơn và cung cấp những sự kiện khi bộ đệm được làm đầy. Tuy nhiên, tôi thấy rằng các sự kiện không được đệm ở tất cả; thay vào đó, SendBuffer() được gọi ngay lập tức mỗi lần lỗi được ghi lại.

Có lỗi trong cấu hình của tôi không?

Cảm ơn

Trả lời

8

dòng này:

this.Evaluator = new log4net.Core.LevelEvaluator(Level.Off); 

kể appender để tuôn ra bộ đệm khi một tin nhắn với mức bằng hoặc phía trên the evaluator đã được nhận. Level.Off do đó sẽ chặn tất cả các sự kiện.

Cập nhật: sau khi truy tìm nguồn log4 một lần nữa Tôi không thể thấy lý do đệm không hoạt động cho bạn.

Update2: Tôi đã bối rối, nhưng một lần nữa, tôi thấy mình quên về trình đăng nhập log4net cần the ActivateOptions để được gọi sau khi cài đặt đã được thay đổi. Cho đến khi ActivateOptions được gọi, bộ đệm tuần hoàn bên trong không được tạo và việc đệm sẽ không xảy ra.

Vì vậy, thực hiện một thử nghiệm appender nhanh:

public sealed class MyBufferingAppender: BufferingAppenderSkeleton 
    { 
     public MyBufferingAppender() 
     { 
      BufferSize = 3; 
      ActivateOptions(); 
     } 

     public readonly List<LoggingEvent> SentEvents = new List<LoggingEvent>(); 
     protected override void SendBuffer(LoggingEvent[] events) 
     { 
      SentEvents.AddRange(events); 
     } 
    } 

... và một thử nghiệm nhanh:

[Test] 
    public void DoAppend_BuffersEvents() 
    { 
     var appender = new MyBufferingAppender(); 

     appender.DoAppend(new LoggingEvent(
      new LoggingEventData {Level = Level.Error, Message = "Hello world"})); 

     Assert.That(appender.SentEvents, Has.Count(0)); 
    } 

Xét nghiệm này đi (trên máy tính của tôi ít nhất :).

+1

Sự hiểu biết của tôi là nó nói với appender để tuôn ra khi một tin nhắn vượt quá ngưỡng quy định được nhận. http://logging.apache.org/log4net/release/sdk/log4net.Core.LevelEvaluator.html Tôi cũng hiểu rằng Level.Off là ngưỡng cao nhất. http://logging.apache.org/log4net/release/sdk/log4net.Core.Level.Off.html Một trong hai lỗi này có đúng không? – Eric

+0

@Eric: xem câu trả lời cập nhật của tôi. –

+0

được thực hiện tốt. Đó là làm việc cho tôi. Cảm ơn bạn. – Eric

3

gì bạn muốn làm có thể được thực hiện với cấu hình sau:

<bufferSize value="3" /> 
<lossy value="false" /> 
<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR" /> 
    <levelMax value="FATAL" /> 
</filter> 

hiểu biết của tôi là Threshold mà nói với log4net khi để tuôn ra bộ đệm (nó sẽ cũng tuôn ra nếu bạn đạt đến kích thước bộ đệm). Nếu bạn muốn loại trừ thư khỏi nhật ký, bạn cần sử dụng bộ lọc. Trong mã này hoạt động như sau:

this.BufferSize = 3; 
this.Lossy = false; 

var filter = new log4net.Filter.LevelRangeFilter(); 
filter.LevelMin = log4net.Core.Level.Error;   
this.AddFilter(filter); 

Btw. bộ đệm được lấp đầy và trên thông báo lỗi thứ 4, các tin nhắn được gửi đi. Vì vậy, nếu bạn muốn 3 tin nhắn chỉ trong email, bạn phải thiết lập kích thước bộ đệm đến 2 ...

+0

Hey Stefan. Điều này mang lại cho tôi những hành vi tương tự. Tức là, các thông báo lỗi được gửi ngay lập tức, chứ không phải là bộ đệm. – Eric

+0

bạn đã xóa dòng "Ngưỡng" trong mã của mình? –

+0

Tôi đã xóa đường Ngưỡng. – Eric

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