はじめに
とある秘密プロジェクト X で作成したバッチを実行してエラーログを出力した際、例外の内容が消失した事件が発生しました。例外の内容はどこにいったのか … その謎を解き明かしていきます。
対象のコード
catch (Exception ex)
{
_logger.LogError("ここにメッセージが入っていたよ", ex);
}
結論
_logger.LogError の使い方が間違っていました。解き明かすプロセスを楽しみにしていた人はごめんなさい。単純だったので解き明かすプロセスの話が思い浮かばなかったのです。許してください。さて、正しい使い方はこうです。
catch (Exception ex)
{
_logger.LogError("ここにメッセージが入っていたよ {ex}", ex);
}
引数に指定した ex を string 引数の方で指定してあげなくては出力されなかったのです。ex からしてみると休日上司に呼び出しをくらって会社に出社したときに「呼び出した理由?ん~、何だっけ、忘れちゃった。」と言われたようなものです。私だったら顔には出しませんが、内心発狂しています。ちなみに例外を先に持ってきて以下のように書いても例外は出力されます。
catch (Exception ex)
{
_logger.LogError(ex ,"ここにメッセージが入っていたよ" );
}
というわけでログの出力時に渡す引数の順番や引数の内容に気をつけましょうという話でした。