是否有一种方法可编程地刷新log4net中的缓冲区

是否有一种方法可编程地刷新log4net中的缓冲区,log4net,buffer,flush,adonetappender,Log4net,Buffer,Flush,Adonetappender,我正在使用log4net和AdoNetAppender。看起来阿多内塔人有一个。我可以从我的代码中调用它吗 我正在尝试创建一个管理页面来查看数据库日志中的所有条目,我希望设置具有bufferSize=100(或更多)的log4net,然后我希望管理员能够单击管理页面上的按钮,强制log4net将缓冲日志条目写入数据库(而不关闭log4net) 这可能吗?假设您使用的是开箱即用的log4net,您可以像这样向下挖掘并刷新appender: public void FlushBuffers() {

我正在使用log4net和AdoNetAppender。看起来阿多内塔人有一个。我可以从我的代码中调用它吗

我正在尝试创建一个管理页面来查看数据库日志中的所有条目,我希望设置具有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();
            }
        }
    }
}

Edit:我写上述内容的前提是,您希望刷新特定
ILog
的附加器(现在我重读了这个问题,这可能是一个错误的假设),但正如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();
        }
    }
}

如今,更简单的选项可用:

LogManager.Flush();
刷新默认存储库中所有配置的附加程序中缓冲的日志记录事件。

强烈建议添加超时,如

LogManager.Flush(3000);

我认为log4net.LogManager.GetRepository().GetAppenders();无论附加到哪个记录器,都将获得所有附加程序…ILOGGERROUPTION repository=LogManager.GetRepository();IEnumerable appenders=repository.GetAppenders().OfType();foreach(appenders中的var appender)appender.Flush();知道如何刷新Log4net 1.2.9.0中的AdoNetAppender吗?@Random-我相信上面的代码应该刷新AdoNetAppender(它应该是一个
缓冲AppenderSkeleton
)。不是吗?(当然,您也可以在config中将缓冲区大小设置为
1
)Flush(flushLossyBuffer)有什么用?我在adonetappoender登记