我将 log4net 与 AdoNetAppender 一起使用。似乎 AdoNetAppender 有一个Flush 方法。无论如何我可以从我的代码中调用它吗?
我正在尝试创建一个管理页面来查看数据库日志中的所有条目,并且我想使用 bufferSize=100(或更多)设置 log4net,然后我希望管理员能够单击管理员上的按钮页面强制 log4net 将缓冲的日志条目写入数据库(不关闭 log4net)。
那可能吗?
我将 log4net 与 AdoNetAppender 一起使用。似乎 AdoNetAppender 有一个Flush 方法。无论如何我可以从我的代码中调用它吗?
我正在尝试创建一个管理页面来查看数据库日志中的所有条目,并且我想使用 bufferSize=100(或更多)设置 log4net,然后我希望管理员能够单击管理员上的按钮页面强制 log4net 将缓冲的日志条目写入数据库(不关闭 log4net)。
那可能吗?
假设您使用的是开箱即用的 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();
}
}
}
今天提供了更简单的选项:
LogManager.Flush();
刷新默认存储库中所有已配置附加程序中缓冲的日志记录事件。 https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm
强烈建议添加超时,例如
LogManager.Flush(3000);
即使使用了 Flush 或设置了 ImmediateFlush,更改也不会立即反映在日志文件中。为了触发 FileSystemWatcher 事件,您可以这样做
if (appender.ImmediateFlush)
{
using (FileStream fs = new FileStream(appender.File,
FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
{ }
}