2010-01-12 17 views
51

numaralı arabelleği programlanabilir şekilde yıkamak için lognet ağını AdoNetAppender ile kullanıyorum. AdoNetAppender'ın bir Flush method sahip olduğu görülüyor. Zaten benim kodumdan onu arayabilir miyim?Programlanabilir bir şekilde log4net

Veritabanı günlüğündeki tüm girdileri görüntülemek için bir yönetici sayfası oluşturmaya çalışıyorum ve log4net'i bufferSize = 100 (veya daha fazla) ile kurmak istiyorum, sonra yöneticinin bir log4net'in tamponlu günlük girişlerini veritabanına yazmasını (log4net'i kapatmadan) yönetmek için yönetici sayfasındaki düğme.

Bu mümkün mü?

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(); 
      } 
     } 
    } 
} 

Düzenleme: Eğer kutunun dışında log4net kullandığınız varsayarak

cevap

79

, böyle appender temizlemek aşağı & yol kazmak I varsayımı altında yukarıda yazdığı Belirli bir ILog için ekleri temizlemek istediniz (muhtemelen soruyu yeniden okudum muhtemelen kötü bir varsayım), ancak Stefan aşağıdaki bir yorumda belirttiği gibi, tüm ekleri genelinde temizlemeyi istiyorsanız, kodu biraz basitleştirebilirsiniz tüm depo aşağıdaki gibi:

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

Bence bu log4net.LogManager.GetRepository(). GetAppenders(); Hangi ekleyicilere bağlı olduklarına bakmaksızın tüm ekleri alacaksınız ... –

+0

@Stefan: Well spotted. Cevabımı güncelledim. Teşekkürler. – Alconja

+5

ILoggerRepository repository = LogManager.GetRepository(); IEnumerable appenders = repository.GetAppenders() .OfType (); foreach (eklerde var olan ek) appender.Flush(); –