エラーログにバックトレースを含めるにあたって気になることがある。どの場所のバックトレースを出すかについて次の選択肢があるように思えてしまうのだ。
- エラーの発生箇所
- ログ出力の実行箇所
1番目と2番目のどちらを選ぶべきだろうか。もし両者の場所が常に一致するなら悩む必要はない。だがウェブAPIのエラーについてログ出力をレスポンス時に行うとなると一致は望めない。ここに悩みの余地がある。おそらく不具合調査で重要となるのはエラー発生箇所の方だろう。選ぶならこちらだ。しかしログ出力の実行箇所の方を不要と言い切れる自信はない。
確信を持って選べないのであれば両方を出してみてはどうか。調査観点では情報が増えて困ることもないだろう。もちろんログの格納や検索に要するコストとのトレードオフはある。もしコストを許容できないならログ出力の実行箇所は捨てる他ないだろう。ではコストを許容できて両方をログに出すことにしたとして、どのように出すのが良いだろうか。
ログの構造について思いつく参考資料はOpenTelemetry Logging仕様のLogs Data Modelだ。 見るとSemantic Conventions for Exceptions in Logsに exception.stacktrace という属性の記載がある。これはエラー発生箇所のようだ。一方でログ出力箇所についての記載は見当たらない。
仕様にこそログ出力箇所の記載はないがAppendix A. Example MappingsのZapの項に caller フィールドの記載がある。どうやらログの出力箇所は Attributes すなわち追加情報の一つとして扱われるもののようだ。
Example MappingsのZap以外の項にはログ出力の実行箇所と思われるフィールドは見当たらなかった。思った以上に重要性が低い情報なのかもしれない。