【问题标题】:Is there a way to programmably flush the buffer in log4net有没有办法以可编程方式刷新 log4net 中的缓冲区
【发布时间】:2011-01-03 23:51:16
【问题描述】:

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

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

这可能吗?

【问题讨论】:

    标签: log4net buffer flush adonetappender


    【解决方案1】:

    假设您使用的是开箱即​​用的 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();
            }
        }
    }
    

    【讨论】:

    • 我认为 log4net.LogManager.GetRepository().GetAppenders();无论附加到什么记录器,都会让你所有的附加程序......
    • ILoggerRepository 存储库 = LogManager.GetRepository (); IEnumerable appenders = repository.GetAppenders ().OfType (); foreach (var appender in appenders) appender.Flush();
    • 知道如何在 Log4net 1.2.9.0 中刷新 AdoNetAppender 吗?
    • @Random - 我相信上面的代码应该刷新一个 AdoNetAppender(它应该是一个 BufferingAppenderSkeleton)。不是吗? (当然你也可以在config中设置缓冲区大小为1
    【解决方案2】:

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

    LogManager.Flush();
    

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

    强烈建议加个超时时间,比如

    LogManager.Flush(3000);
    

    【讨论】:

    • flush(flushLossyBuffer)有什么用?我正在 adonetappoender 中检查它
    【解决方案3】:

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

    if (appender.ImmediateFlush)
      {
        using (FileStream fs = new FileStream(appender.File, 
                               FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
        { }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2012-02-29
      • 2011-11-22
      • 2023-03-08
      相关资源
      最近更新 更多