59

我将 log4net 与 AdoNetAppender 一起使用。似乎 AdoNetAppender 有一个Flush 方法。无论如何我可以从我的代码中调用它吗?

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

那可能吗?

4

3 回答 3

87

假设您使用的是开箱即​​用的 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(现在我重新阅读问题可能是一个糟糕的假设),但正如 Stefan 在下面的评论中指出的那样,你可以简化代码如果您想刷新整个存储库中的所有附加程序,如下所示:

public void FlushBuffers()
{
    ILoggerRepository rep = LogManager.GetRepository();
    foreach (IAppender appender in rep.GetAppenders())
    {
        var buffered = appender as BufferingAppenderSkeleton;
        if (buffered != null)
        {
            buffered.Flush();
        }
    }
}
于 2010-01-12T00:51:37.697 回答
10

今天提供了更简单的选项:

LogManager.Flush();

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

强烈建议添加超时,例如

LogManager.Flush(3000);
于 2018-09-18T09:47:08.137 回答
0

即使使用了 Flush 或设置了 ImmediateFlush,更改也不会立即反映在日志文件中。为了触发 FileSystemWatcher 事件,您可以这样做

if (appender.ImmediateFlush)
  {
    using (FileStream fs = new FileStream(appender.File, 
                           FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
    { }
  }
于 2021-12-07T06:35:56.943 回答