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

Hen*_*bæk 57 log4net buffer flush adonetappender

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

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

那可能吗?

Alc*_*nja 83

假设您正在使用开箱即用的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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在假设你想要刷新特定的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • ILoggerRepository repository = LogManager.GetRepository(); IEnumerable <BufferingAppenderSkeleton> appenders = repository.GetAppenders().OfType <BufferingAppenderSkeleton>(); foreach(在appender中的var appender)appender.Flush(); (5认同)
  • 我认为是log4net.LogManager.GetRepository().GetAppenders(); 无论他们附加什么记录器,都会给你所有的追随者...... (4认同)
  • @Random - 我相信上面的代码应该刷新AdoNetAppender(它应该是一个`BufferingAppenderSkeleton`).不是吗?(当然你也可以将config中的缓冲区大小设置为"1") (2认同)

Lev*_*Lev 7

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

LogManager.Flush();
Run Code Online (Sandbox Code Playgroud)

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

强烈建议添加超时,例如

LogManager.Flush(3000);
Run Code Online (Sandbox Code Playgroud)