AdoNetAppenderでlog4netを使用しています。 AdoNetAppenderには Flushメソッド があるようです。とにかくコードから呼び出すことができますか?
データベースログのすべてのエントリを表示するための管理ページを作成しようとしています。log4netにbufferSize = 100(またはそれ以上)を設定したいので、管理者が管理者のボタンをクリックできるようにします。 log4netがバッファされたログエントリをデータベースに書き込むように強制するページ(log4netをシャットダウンしないで)。
それは可能ですか?
箱から出してすぐに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();
}
}
}
今日より簡単なオプションが利用可能です:
LogManager.Flush();
デフォルトのリポジトリー内のすべての構成済みアペンダーでバッファーに入れられたロギング・イベントをフラッシュします。 https://logging.Apache.org/log4net/release/sdk/html/M_log4net_LogManager_Flush.htm
次のようなタイムアウトを追加することを強くお勧めします
LogManager.Flush(3000);