Is er een manier om de buffer in log4net programmeerbaar te spoelen

Ik gebruik log4net met AdoNetAppender. Het lijkt erop dat de AdoNetAppender een Flush-methodeheeft. Kan ik dat op een of andere manier vanuit mijn code bellen?

Ik probeer een beheerderspagina te maken om alle vermeldingen in het databaselogboek te bekijken, en ik wil log4net instellen met bufferSize=100 (of meer), dan wil ik dat de beheerder op een knop kan klikken op de beheerderspagina om log4net te dwingen de gebufferde loggegevens naar de database te schrijven (zonder log4net af te sluiten).

Is dat mogelijk?


Antwoord 1, autoriteit 100%

Ervan uitgaande dat u log4net kant-en-klaar gebruikt, kunt u zich een weg banen & spoel de appender als volgt:

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();
            }
        }
    }
}

Bewerken: ik schreef het bovenstaande in de veronderstelling dat je de appenders voor een specifieke ILogwilde wissen (waarschijnlijk een verkeerde veronderstelling nu ik de vraag opnieuw lees ), maar zoals Stefan in een opmerking hieronder aangeeft, kun je de code een beetje vereenvoudigen als je alle appenders als volgt door de hele repository wilt spoelen:

public void FlushBuffers()
{
    ILoggerRepository rep = LogManager.GetRepository();
    foreach (IAppender appender in rep.GetAppenders())
    {
        var buffered = appender as BufferingAppenderSkeleton;
        if (buffered != null)
        {
            buffered.Flush();
        }
    }
}

Antwoord 2, autoriteit 11%

Vandaag is een eenvoudigere optie beschikbaar:

LogManager.Flush();

Flusht logboekgebeurtenissen die zijn gebufferd in alle geconfigureerde appenders in de standaardrepository.
https://logging.apache.org/log4net/release/sdk/html /M_log4net_LogManager_Flush.htm

Het wordt sterk aanbevolen om een ​​time-out toe te voegen, zoals

LogManager.Flush(3000);

Antwoord 3

Zelfs als Flush wordt gebruikt of ImmediateFlush is ingesteld, worden wijzigingen niet onmiddellijk weergegeven in het logbestand. Om de FileSystemWatcher-gebeurtenissen te activeren, kunt u dit doen

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

Other episodes