2016-12-08 6 views
0

私はlog4netにXML設定を使用しています。私は、次のアペンダ-レフリーがあります。実行時にアペンダをアタッチまたはデタッチ

<root> 
    <level value="ALL" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="OldRollingLogAppender" /> 
</root> 

(。私も問題ではないはずXML-その正確な実装で定義されたこれらのこれらのアペンダを持っている)を

私は、実行時に、削除したいですOldRollingLogAppenderを作成し、NewRollingLogAppenderという新しい名前を作成して追加します。これはどうすればいいですか?

最小限の作業例が良いでしょう。

答えて

1

あなたはルートロガーを取得することによってこれを行い、その後、追加し、アペンダを削除することができます。

削除:

var root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root; 
root.RemoveAppender(xxx); 

追加:あなたがアペンダのリストを反復処理することができます

var root = ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root; 
root.AddAppender(xxx); 

ルート付き。アペンダー https://logging.apache.org/log4net/release/sdk/html/AllMembers_T_log4net_Repository_Hierarchy_RootLogger.htm

+0

これは機能しません。何も起こりません。私はこれを呼ぶ必要がある特定の時間はありますか?私が設定する必要がある特別なフラグ、または私が逃している他の魔法のものはありますか? –

+0

更新:CreateLoggerを呼び出す前にこれを行うと、空のログファイルが取得されます。私が* after *を呼んだ場合、変更はありません。 –

+0

これはうまくいくはずですが、アペンダーを削除してから、そのアペンダーを閉じる()必要があります。 – thudbutt

0

ピーターの答えにadditonで、私は次の操作を行う必要がありました:を追加または削除する前に

1)を、私が呼び出す必要がありました:

XmlConfigurator.Configure() 

を最初にこれを実行しないと、log4netのは、私はいずれかを削除できないだろう古いアペンダー。

2)新しいアペンダーを追加すると、実行時にC#でアペンダーを作成する必要がありました。これをXMLから抽出できませんでした。私はコードが行われた追加/削除のため、私はしていた(それはまだ可能かもしれないが... ...私はちょうどそれが間違ってやっていることがあります。)すなわち、

PatternLayout patternLayout = new PatternLayout(); 
patternLayout.ConversionPattern = ...; 
patternLayout.ActivateOptions(); 

RollingFileAppender serviceAppender = new RollingFileAppender(); 
serviceAppender.Name = "NewRollingLogAppender"; 
serviceAppender.File = ...; 
serviceAppender.DatePattern = ...; 
serviceAppender.AppendToFile = ...; 
serviceAppender.StaticLogFileName = ...; 
serviceAppender.Layout = patternLayout; 
serviceAppender.ActivateOptions(); 

3)すべて後電話:

(Hierarchy)(LogManager.GetRepository()).RaiseConfigurationCh‌​anged(EventArgs.Empt‌​y); 

これを行わないと、log4netは変更を取得しません。

4)私は、XmlConfigurator.Configure()が呼ばれ、古い(削除される)アペンダーに関連付けられたログファイルを作成してロックすることを観察しました。私はこれが起こることを望んでいませんでした。これを回避するには、OpenFileCloseWriter、およびAppendをオーバーライドするカスタムアペンダーを作成する必要がありました。実行時に、このアペンダーを「オプトアウト」するかどうかを判断してXmlConfigurator.Configure()を呼び出すことができました。