有没有办法可以在log4net中可编程刷新缓冲区

问题描述 投票:55回答:2

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

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

那可能吗?

log4net buffer flush adonetappender
2个回答
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();
        }
    }
}

4
投票

今天提供更简单的选项:

LogManager.Flush();

刷新在默认存储库中的所有已配置的appender中缓冲的日志记录事件。 https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

强烈建议添加超时,例如

LogManager.Flush(3000);
© www.soinside.com 2019 - 2024. All rights reserved.