59

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

データベース ログのすべてのエントリを表示する管理ページを作成しようとしています。log4net を bufferSize=100 (またはそれ以上) でセットアップしたいので、管理者が管理ページのボタンをクリックできるようにしたいと考えています。ページを使用して、log4net がバッファリングされたログ エントリをデータベースに書き込むように強制します (log4net をシャットダウンする必要はありません)。

それは可能ですか?

4

3 に答える 3

87

箱から出して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(質問を読み直したので、おそらく悪い前提です)が、Stefanが下のコメントで指摘しているように、コードを単純化できます次のように、リポジトリ全体ですべてのアペンダーをフラッシュする場合は、ほとんどありません。

public void FlushBuffers()
{
    ILoggerRepository rep = LogManager.GetRepository();
    foreach (IAppender appender in rep.GetAppenders())
    {
        var buffered = appender as BufferingAppenderSkeleton;
        if (buffered != null)
        {
            buffered.Flush();
        }
    }
}
于 2010-01-12T00:51:37.697 に答える
0

Flush を使用したり、ImmediateFlush を設定したりしても、変更はすぐにログ ファイルに反映されません。FileSystemWatcher イベントを発生させるには、次のようにします。

if (appender.ImmediateFlush)
  {
    using (FileStream fs = new FileStream(appender.File, 
                           FileMode.Open, FileAccess.Read, ileShare.ReadWrite))
    { }
  }
于 2021-12-07T06:35:56.943 に答える