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 ILog
wilde 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))
{ }
}