2010-01-12 16 views
51

J'utilise log4net avec AdoNetAppender. Il semble que l'AdoNetAppender ait un Flush method. Y at-il de toute façon que je peux appeler cela à partir de mon code? J'essaye de créer une page d'admin pour voir toutes les entrées dans le journal de base de données, et je voudrais installer log4net avec bufferSize = 100 (ou plus), alors je veux que l'administrateur puisse cliquer sur un bouton sur la page d'administration pour forcer log4net à écrire les entrées du journal mis en mémoire tampon dans la base de données (sans fermer log4net).Y at-il de toute façon vider par programmation le tampon dans log4net?

Est-ce possible?

Répondre

79

En supposant que vous utilisez log4net hors de la boîte, vous pouvez creuser votre chemin vers le bas & vider le appender comme ceci:

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

Modifier: J'ai écrit ci-dessus sous l'hypothèse que vous vouliez vider les appenders pour un ILog spécifique (probablement une mauvaise supposition maintenant que j'ai relu la question), mais comme Stefan le souligne dans un commentaire ci-dessous, vous pouvez simplifier le code un peu si vous voulez vider tous les appenders à travers l'ensemble du dépôt comme suit:

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

Je pense que log4net.LogManager.GetRepository(). GetAppenders(); vous obtiendrez tous les appenders, peu importe à quel enregistreur ils sont attachés ... –

+0

@Stefan: Bien repéré. J'ai mis à jour ma réponse. Merci. – Alconja

+5

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