多くの環境では例外が起きるとスタックトレースがログに記録される。メソッドの呼び出し階層が深くなるとスタックトレースも長くなり、数十行になることも珍しくない。
例外がログに記録される状況があったときに、その頻度を時系列に沿って追い駆けたい、ということがある。そのような場合、例外メッセージやスタックトレースの特徴的な文字列を元に検索するのが普通ではないだろうか。しかしその特徴的な文字列が本当にその例外からのみ起こるのか、確信が持てないことがある。もしかしたら、その文字列が別の箇所でロギングされているかもしれない。
スタックトレースのハッシュを生成してログに記録するようにすれば、例外の発生を一意に特定して、文字列が別の場所で起きていることを心配せずに検索できるのではないだろうか。
例外メッセージは具体的な値によって異なる文字列になることがありそう(たとえば Unexpected mail address: abc
というメッセージで abc
部分が変わる場合など)なので、ハッシュする対象に加えないほうが良さそう。
https://github.com/tkawachi/exhash で Java の実装をしてみた。
これではスタックトレースのクラス名とメソッド名だけをハッシュする対象にしている。
行数を対象にしないことで、呼び出し階層を変更しないソースコードの変更があっても、同じハッシュ値になるようにしている。その代わり、呼び出し階層が同じで行番号が異なる例外は区別できない。1メソッドあたりの行数が十分に小さければ、区別できないことはさほど問題にならないだろう。
同レポジトリで logback 用の converter を作った。logback を使っているプロジェクトなら、依存の追加とログ設定ファイルの変更だけで、例外のハッシュをログに出力することができる。プログラムのソースコードを変更する必要はない。
(アイデアが実際のところ上手く機能するかはまだ試していない。)