2015-10-21 16 views
5

私たちは内部で開発されたロギングシステムを使用しており、複数のアペンダを同時に使用できるなど、log4netの利点を得たかったのです。従来のログシステムをカスタムlog4netアペンダに移行することにしました。レガシーシステムが正しく設定されていてもレガシーロガーが実際にWCFクライアントに書き込むときにはうまくいきました(冗長なロギングが遅くなり、他のlog4netアペンダーとやりたい理由)。になるはずだった。これが起こったとき、アプリケーションは正常に動作したように見えましたが、レガシーシステムのカスタムアペンダーは動作していませんでした。他のアペンダーは正常に動作しましたが、カスタムレガシーアペンダーの出力はなく、問題があることを示すエラーメッセージも表示されませんでした。カスタムlog4netアペンダ内でのロギング/エラー処理

「再帰的」ロギングを処理する適切な方法は何ですか?つまり、カスタムlog4netアペンダからのログです。私は素朴な解決策を試してみました:アペンダ内部の静的オブジェクトおよびログからのグラブにlog4net:

public class MyCustomAppender : AppenderSkeleton 
{ 

    protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
    { 
     try 
     { 
      // something which throws here... 
     } 
     catch (Exception ex) 
     { 
      log4net.LogManager.GetLogger(this.GetType()).Error(this.GetType().ToString() + ": error during append", ex); 
     } 
    } 
} 

これは惨めな失敗だった「System.Threading.LockRecursionException:このモードでは使用できません再帰的な読み取りロックの獲得」けっこうだ;それは素朴な解決策でした。

は、私も試してみました:例外ハンドラで

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

、それが可能に見えたとして、それは正しいことかもしれません。何も明らかに起こらなかった。

appender内のlog4netでエラーを記録する方法はありますか?または、Windowsイベントログに直接ハードコードを書き込むような何かをしなければならないのですか?明らかに、無限の再帰的な降下の大きな危険がありますが、私は、オペレータが実行できなかったアペンダの1つを知らせる何らかの方法があると思います。

JR

答えて

3

質問を投稿したらすぐに何かを思い出しました。 log4netには、appSettings内にデバッグスイッチがあります。私はこのコードを使用:catchブロック内

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex); 

を、その後に設定魔法を設定します。

<appSettings> 
    <!--this is wonderful magic--> 
    <add key="log4net.Internal.Debug" value="true" /> 
</appSettings> 

は今ConsoleAppender(私が使っていた他のアペンダ)は、カスタムアペンダの例外メッセージを出します。 JR

0

あなたが一番上にこの行を持っていることを確認してください: System.Threadingを使用して、

+0

元の問題は何かを忘れていましたが、私の主張はカスタムlog4netアペンダーを実行時にlog4netメカニズムにログインさせることでした。私が知る限り、 "using"ステートメントはコンパイル時にのみ修正します。コンパイルの問題は全くありませんでした。私は実行時に何がうまくいかないかを知る必要がありました。 – jrv

関連する問題