60

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 an admin page to view all the entries in the database log, and I will like to setup log4net with bufferSize=100 (or more), then I want the administrator to be able to click an button on the admin page to force log4net to write the buffered log entries to the database (without shutting down log4net).

Is that possible?

3 Answers 3

88

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();
        }
    }
}
4
  • 4
    I think that log4net.LogManager.GetRepository().GetAppenders(); will get you all appenders no matter to what logger they are attached... Commented Jun 15, 2010 at 7:58
  • 5
    ILoggerRepository repository = LogManager.GetRepository (); IEnumerable<BufferingAppenderSkeleton> appenders = repository.GetAppenders ().OfType<BufferingAppenderSkeleton> (); foreach (var appender in appenders) appender.Flush (); Commented Nov 26, 2010 at 15:36
  • Any idea how to flush AdoNetAppender in Log4net 1.2.9.0?
    – Random
    Commented Apr 7, 2011 at 9:56
  • 2
    @Random - I believe the above code should flush an AdoNetAppender (it should be a BufferingAppenderSkeleton). Does it not? (Of course you could also just set the buffer size in config to 1)
    – Alconja
    Commented Apr 11, 2011 at 4:36
13

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);
1
  • what's the use of Flush(flushLossyBuffer)? I am checking it in adonetappoender Commented Sep 7, 2020 at 18:58
0

Even if Flush is used or ImmediateFlush is set, changes are not reflected immediately in the log file. In order for the FileSystemWatcher events to fire, you can do this

if (appender.ImmediateFlush)
  {
    using (FileStream fs = new FileStream(appender.File, 
                           FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
    { }
  }

Not the answer you're looking for? Browse other questions tagged or ask your own question.