web-dev-qa-db-fra.com

Existe-t-il un moyen de vider le tampon par programme dans log4net

J'utilise log4net avec AdoNetAppender. Il semble que AdoNetAppender ait un méthode Flush . Est-il possible de l'appeler depuis mon code?

J'essaie de créer une page d'administration pour afficher toutes les entrées dans le journal de la base de données, et j'aimerais configurer log4net avec bufferSize = 100 (ou plus), puis je veux que l'administrateur puisse cliquer sur un bouton sur l'administrateur pour forcer log4net à écrire les entrées de journal mises en mémoire tampon dans la base de données (sans arrêter log4net).

Est-ce possible?

58
Henrik Stenbæk

En supposant que vous utilisez log4net hors de la boîte, vous pouvez creuser votre chemin et vider l'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();
            }
        }
    }
}

Edit: J'ai écrit ce qui précède sous l'hypothèse que vous vouliez vider les appenders pour un ILog spécifique (probablement une mauvaise hypothèse maintenant que j'ai relu la question), mais comme Stefan souligne dans un commentaire ci-dessous, vous pouvez simplifier un peu le code si vous souhaitez vider tous les appenders sur l'ensemble du référentiel 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();
        }
    }
}
83
Alconja

Aujourd'hui, une option plus simple est disponible:

LogManager.Flush();

Vide les événements de journalisation mis en mémoire tampon dans toutes les annexes configurées dans le référentiel par défaut. https://logging.Apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

Il est fortement recommandé d'ajouter un délai d'expiration, comme

LogManager.Flush(3000);
7
Lev