Is there a way to programmably flush the buffer in log4net

后端 未结 2 2016
滥情空心
滥情空心 2020-12-13 05:35

I\'m using log4net with AdoNetAppender. It\'s seems that the AdoNetAppender has a Flush method. Is there anyway I can call that from my code?

I\'m trying to create

相关标签:
2条回答
  • 2020-12-13 06:09

    Assuming you're using log4net out of the box, you can dig your way down & flush the appender like this:

    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: I wrote the above under the assumption that you wanted to flush the appenders for a specific ILog (probably a bad assumption now that I re-read the question), but as Stefan points out in a comment below, you can simplify the code a little if you want to flush all appenders across the whole repository as follows:

    public void FlushBuffers()
    {
        ILoggerRepository rep = LogManager.GetRepository();
        foreach (IAppender appender in rep.GetAppenders())
        {
            var buffered = appender as BufferingAppenderSkeleton;
            if (buffered != null)
            {
                buffered.Flush();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-13 06:31

    Today simpler option is available:

    LogManager.Flush();
    

    Flushes logging events buffered in all configured appenders in the default repository. https://logging.apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

    It is highly recommended to add a timeout, like

    LogManager.Flush(3000);
    
    0 讨论(0)
提交回复
热议问题