我正在使用AdoNetAppender的log4net。它似乎有一个Flush方法。我能否从我的代码中调用它?
我正在尝试创建一个管理员页面来查看数据库日志中的所有条目,并且我想要设置log4net的bufferSize=100(或更多),然后我希望管理员能够在管理员页面上单击一个按钮,强制log4net将缓冲日志条目写入数据库(而不关闭log4net)。
这可能吗?
我正在使用AdoNetAppender的log4net。它似乎有一个Flush方法。我能否从我的代码中调用它?
我正在尝试创建一个管理员页面来查看数据库日志中的所有条目,并且我想要设置log4net的bufferSize=100(或更多),然后我希望管理员能够在管理员页面上单击一个按钮,强制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
的 Appenders(现在重新阅读问题后这可能是错误的假设),但正如 Stefan 在下面的评论中指出的那样,如果您想要刷新整个仓库中的所有 Appenders,您可以简化代码如下: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);
if (appender.ImmediateFlush)
{
using (FileStream fs = new FileStream(appender.File,
FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
{ }
}
BufferingAppenderSkeleton
)。难道不是吗?(当然,您也可以在配置中将缓冲区大小设置为1
) - Alconja