无论如何都可以在log4net中以可编程方式刷新缓冲区

时间:2010-01-12 00:29:40

标签: log4net buffer flush adonetappender

我正在使用log4net和AdoNetAppender。似乎AdoNetAppender有一个Flush method。无论如何我可以从我的代码中调用它吗?

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

这可能吗?

2 个答案:

答案 0 :(得分:82)

假设您正在使用开箱即用的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刷新appender的情况下编写了上述内容(现在我重新阅读了这个问题可能是个错误的假设),但是正如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();
        }
    }
}

答案 1 :(得分:4)

今天可以使用更简单的选项:

LogManager.Flush();
  

刷新缺省存储库中所有已配置的附加程序中缓冲的日志记录事件。   https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

强烈建议添加超时,例如

LogManager.Flush(3000);