2010-01-12 3 views
51

Ich benutze log4net mit AdoNetAppender. Es scheint, dass der AdoNetAppender eine Flush method hat. Kann ich das überhaupt von meinem Code aus anrufen?Gibt es sowieso, um den Puffer in log4net programmierbar zu leeren

Ich versuche eine Admin-Seite zu erstellen, um alle Einträge im Datenbankprotokoll anzuzeigen, und ich möchte log4net mit pufferSize = 100 (oder mehr) einrichten, dann möchte ich, dass der Administrator auf ein klicken kann Schaltfläche auf der Admin-Seite, um zu erzwingen, dass log4net die gepufferten Log-Einträge in die Datenbank schreibt (ohne log4net herunterzufahren).

Ist das möglich?

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

bearbeiten:

Antwort

79

Angenommen, Sie verwenden aus der Box log4net, können Sie Ihren Weg nach unten & spülen appender wie diese graben schrieb ich die oben unter der Annahme, dass Sie wollten die Appender für eine bestimmte ILog spülen (wahrscheinlich eine schlechte Annahme, jetzt, da ich die Frage erneut lese), aber wie Stefan in einem Kommentar unten hervorhebt, können Sie den Code ein wenig vereinfachen, wenn Sie alle Appender überspülen möchten das gesamte Repository wie folgt:

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

Ich denke, dass log4net.LogManager.GetRepository(). GetAppenders(); Sie erhalten alle Appender, unabhängig davon, an welchem ​​Logger sie angehängt sind ... –

+0

@Stefan: Gut entdeckt. Ich habe meine Antwort aktualisiert. Vielen Dank. – Alconja

+5

ILoggerRepository repository = LogManager.GetRepository(); IEnumerable appenders = repository.GetAppenders() .OfType (); foreach (var Appender in Appender) appender.Flush(); –

Verwandte Themen