log4の例外の出力
log4(j|net)をそれぞれ使っていて、ふと使い方が違う点があることに気が付きました(遅いとも言う)。
例外オブジェクト exをlog4jで出力する際には以下の様に書いていました。
logger.error(ex.toString(), ex);
しかし、C#では Exceptionオブジェクトの ToString()メソッドで、例外のスタックトレースが出力されることが保証されているようです。
Exception.ToString の既定の実装は、現在の例外をスローしたクラスの名前、メッセージ、内部例外での ToString の呼び出しの結果、および Environment.StackTrace の呼び出しの結果を取得します。これらのメンバのいずれかが null 参照 (Visual Basic の場合は Nothing) である場合、その値は返される文字列に含まれません。
そのため、log4netでは error(String message, Exception ex) のメソッドを使わずに
logger.error(ex.toString());
とすれば、スタックトレースまでログに出力されました。また別パターンとして
logger.error(ex.Message, ex);
とするのも考えられるのですが、Messageプロパティは FileNotFoundExceptionなどの追加パラメータがある例外では追加パラメータが反映されないため、いまいちでした。何かしらログに出力するメッセージがある場合には、それを第一引数にして第二引数に例外オブジェクトを設定すれば良いのですが、例外だけをログに残したい場合にはどうするのがスマートなんでしょうね?