有没有一种可编程的方式在log4net中清空缓冲区?

60

我正在使用AdoNetAppender的log4net。它似乎有一个Flush方法。我能否从我的代码中调用它?

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

这可能吗?

3个回答

88

假设您正在使用 log4net,您可以像这样深入挖掘并刷新 appender:

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();
            }
        }
    }
}
编辑:我写上面的内容是基于您想刷新特定 ILog 的 Appenders(现在重新阅读问题后这可能是错误的假设),但正如 Stefan 在下面的评论中指出的那样,如果您想要刷新整个仓库中的所有 Appenders,您可以简化代码如下:
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();将获取所有的附加器,无论它们附加到哪个记录器... - Stefan Egli
5
ILoggerRepository repository = LogManager.GetRepository (); IEnumerable<BufferingAppenderSkeleton> appenders = repository.GetAppenders ().OfType<BufferingAppenderSkeleton> (); foreach (var appender in appenders) appender.Flush ();翻译:获取LogManager中的ILoggerRepository仓库,然后从仓库中获得所有BufferingAppenderSkeleton类型的appender,最后遍历每个appender并将其中缓存的日志信息写入目标。 - George Tsiokos
有没有想法如何在Log4net 1.2.9.0中刷新AdoNetAppender? - Random
2
@Random - 我相信上面的代码应该会刷新AdoNetAppender(它应该是一个BufferingAppenderSkeleton)。难道不是吗?(当然,您也可以在配置中将缓冲区大小设置为1 - Alconja

12

Flush(flushLossyBuffer)有什么用?我正在adonetappender中进行检查。 - Kamran Shahid

0
即使使用Flush或设置ImmediateFlush,更改也不会立即反映在日志文件中。为了触发FileSystemWatcher事件,您可以这样做:
if (appender.ImmediateFlush)
  {
    using (FileStream fs = new FileStream(appender.File, 
                           FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
    { }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接