2010-01-12 11 views
51

Tôi đang sử dụng log4net với AdoNetAppender. Có vẻ như AdoNetAppender có một số Flush method. Có anyway tôi có thể gọi đó từ mã của tôi?Có cách nào để lập trình xóa bộ đệm trong log4net

Tôi đang cố gắng tạo trang quản trị để xem tất cả các mục nhập trong nhật ký cơ sở dữ liệu và tôi muốn thiết lập log4net với bufferSize = 100 (hoặc nhiều hơn), sau đó tôi muốn quản trị viên có thể nhấp vào trên trang quản trị để buộc log4net ghi các mục đăng nhập được đệm vào cơ sở dữ liệu (mà không cần tắt log4net).

Điều đó có khả thi không?

Trả lời

79

Giả sử bạn đang sử dụng log4net ra khỏi hộp, bạn có thể khai thác theo cách của bạn xuống & tuôn appender như thế này:

public void FlushBuffers() 
{ 
    ILog log = LogManager.GetLogger("whatever"); 
    var logger = log.Logger as Logger; 
    if (logger != null) 
    { 
     foreach (IAppender appender in logger.Appenders) 
     { 
      var buffered = appender as BufferingAppenderSkeleton; 
      if (buffered != null) 
      { 
       buffered.Flush(); 
      } 
     } 
    } 
} 

Sửa: Tôi đã viết trên dưới giả định rằng bạn muốn xóa các appenders cho một số cụ thể ILog (có lẽ là một giả định xấu bây giờ tôi đọc lại câu hỏi), nhưng như Stefan đã chỉ ra trong một bình luận dưới đây, bạn có thể đơn giản hóa mã một chút nếu bạn muốn xóa tất cả các appender toàn bộ kho lưu trữ như sau:

public void FlushBuffers() 
{ 
    ILoggerRepository rep = LogManager.GetRepository(); 
    foreach (IAppender appender in rep.GetAppenders()) 
    { 
     var buffered = appender as BufferingAppenderSkeleton; 
     if (buffered != null) 
     { 
      buffered.Flush(); 
     } 
    } 
} 
+4

Tôi nghĩ rằng log4net.LogManager.GetRepository() GetAppenders(); sẽ giúp bạn có được tất cả các ứng cử viên không có vấn đề gì với những gì họ đang đính kèm logger ... –

+0

@Stefan: Vâng phát hiện. Tôi đã cập nhật câu trả lời của mình. Cảm ơn. – Alconja

+5

Kho lưu trữ ILoggerRepository = LogManager.GetRepository(); IEnumerable appenders = repository.GetAppenders() .OfType (); foreach (var appender trong appenders) appender.Flush(); –