2010-01-12 55 views
51

我使用log4net与AdoNetAppender。 AdoNetAppender似乎有一个Flush method。无论如何,我可以从我的代码中调用它吗?是否有可编程地刷新log4net中的缓冲区

我试图创建一个管理页面来查看数据库日志中的所有条目,并且我想用bufferSize = 100(或更多)来设置log4net,然后我希望管理员能够单击按钮,强制log4net将缓冲的日志条目写入数据库(不关闭log4net)。

这可能吗?

回答

79

假设你正在使用log4net的开箱即用,你可以掏你一路下跌&刷新这样的附加目的地:

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

编辑:我写了上面的假设下你想冲洗一个特定的appender ILog(现在我重新阅读这个问题可能是一个错误的假设),但正如Stefan在下面的评论中指出的那样,如果你想冲刷所有appender,你可以简化一些代码整个资料库如下:

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

我认为,log4net.LogManager.GetRepository()。GetAppenders();不管他们连接到什么记录器,都能让你获得所有appender ... – 2010-06-15 07:58:42

+0

@Stefan:看上去很好。我已经更新了我的答案。谢谢。 – Alconja 2010-06-15 23:24:55

+5

ILoggerRepository repository = LogManager.GetRepository(); IEnumerable appenders = repository.GetAppenders().OfType (); (appender) appender.Flush(); – 2010-11-26 15:36:21