web-dev-qa-db-ja.com

log4netのバッファをプログラムでフラッシュする方法はありますか

AdoNetAppenderでlog4netを使用しています。 AdoNetAppenderには Flushメソッド があるようです。とにかくコードから呼び出すことができますか?

データベースログのすべてのエントリを表示するための管理ページを作成しようとしています。log4netにbufferSize = 100(またはそれ以上)を設定したいので、管理者が管理者のボタンをクリックできるようにします。 log4netがバッファされたログエントリをデータベースに書き込むように強制するページ(log4netをシャットダウンしないで)。

それは可能ですか?

58
Henrik Stenbæk

箱から出してすぐにlog4netを使用している場合、次のように掘り下げてアペンダーをフラッシュできます。

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

編集:私は、特定のILogのアペンダーをフラッシュしたいという仮定の下で上記を書きました(おそらく、私が質問を読み直したので、おそらく間違った仮定です)。以下のコメントで指摘しているように、リポジトリ全体のすべてのアペンダーを次のようにフラッシュする場合は、コードを少し簡略化できます。

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

今日より簡単なオプションが利用可能です:

LogManager.Flush();

デフォルトのリポジトリー内のすべての構成済みアペンダーでバッファーに入れられたロギング・イベントをフラッシュします。 https://logging.Apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm

次のようなタイムアウトを追加することを強くお勧めします

LogManager.Flush(3000);
7
Lev