有没有办法以可编程方式刷新 log4net 中的缓冲区

Posted

技术标签:

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

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

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

这可能吗?

【问题讨论】:

【参考方案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))
     
  

【讨论】:

以上是关于有没有办法以可编程方式刷新 log4net 中的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式刷新网页 - javascript [重复]

以编程方式获取/刷新 Health Kit 数据?

以编程方式获取/刷新 Health Kit 数据?

以编程方式配置 log4net,但额外的日志记录到控制台

如何以编程方式强制 log4net 释放日志文件以便可以访问它?

刷新磁盘写缓存