我正在使用log4net和AdoNetAppender。似乎AdoNetAppender有一个Flush method。无论如何我可以从我的代码中调用它吗?
我正在尝试创建一个管理页面来查看数据库日志中的所有条目,我想设置log4net并使用bufferSize = 100(或更多),然后我希望管理员能够单击一个按钮在管理页面上强制log4net将缓冲的日志条目写入数据库(不关闭log4net)。
这可能吗?
答案 0 :(得分:82)
假设您正在使用开箱即用的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
刷新appender的情况下编写了上述内容(现在我重新阅读了这个问题可能是个错误的假设),但是正如Stefan在下面的评论中指出的那样,如果要在整个存储库中刷新所有appender,可以按如下方式简化代码:
public void FlushBuffers()
{
ILoggerRepository rep = LogManager.GetRepository();
foreach (IAppender appender in rep.GetAppenders())
{
var buffered = appender as BufferingAppenderSkeleton;
if (buffered != null)
{
buffered.Flush();
}
}
}
答案 1 :(得分:4)
今天可以使用更简单的选项:
LogManager.Flush();
刷新缺省存储库中所有已配置的附加程序中缓冲的日志记录事件。 https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm
强烈建议添加超时,例如
LogManager.Flush(3000);