有没有办法以可编程方式刷新 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 (); IEnumerableBufferingAppenderSkeleton
)。不是吗? (当然你也可以在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 中的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章