以前からエラーログに出すバックトレースが気になっている。どの場所のバックトレースを出すかについて次の選択肢があるように思えるからだ。
- エラーの発生箇所
- ログの出力箇所
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 以外の項にはログの出力箇所と思われるフィールドは見当たらなかった。ログの出力箇所は思った以上に重要性が低い情報なのかもしれない。