10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Laravel]例外処理時のログは汚したくない

Posted at

背景

  • 入社当初、例外処理の知識が薄い時に、こんなコードを書いた
    • エラーメッセージはユーザー向けに書いたつもりだった
class LogController extends Controller
{
    public function index()
    {
				...
        try {
						...
            // エラー発生した時の処理
            throw new Exception('ユーザーは取得できませんでした。');
        } catch(Exception $e) {
            Log::error($e);
            throw $e;
        }
    }
}
  • これで例外投げたときのブラウザはこう👇

image.png

  • そして、laravel.logはこう👇
[2021-12-11 07:11:54] local.ERROR: ユーザーは取得できませんでした {"exception":"[object] (Exception(code: 0): ユーザーは取得できませんでした。 at C:\\xampp\\htdocs\\...\\LogController.php:17)
[stacktrace]
...
...
  • これに対して、レビュワーさんからコメント

「例外処理の使い方見直して、修正お願いします。」

  • 何が正しいんだ?と(本気で)思って自分で調べたり、質問したりして納得したのですが、そこからちゃんとログを見直すことになったな、と振り返り初心に帰りアウトプット

内容

まずは、問題点が2点。

  1. 例外時に開発者向けのブラウザ表示は見せちゃダメ
  2. この書き方ではログが汚れるのでダメ
  • まず、1についてはそりゃそうだ、ということで割愛します。

    • そもそも、「例外処理」というものは開発者向け、ユーザー向けのメッセージを出すものではない、という当たり前が頭に入っていなかったわけです…
    • ※当時は入社当初なので多めにお手柔らかにお願いします。。。
  • そして、本題は2

  • **「ログが汚れる」**とはどういうことか。

    • laravel.logで確認

👇before:先ほどのコードによるログ(再掲)

[2021-12-11 07:11:54] local.ERROR: ユーザーは取得できませんでした {"exception":"[object] (Exception(code: 0): ユーザーは取得できませんでした。 at C:\\xampp\\htdocs\\...\\LogController.php:17)
[stacktrace]
...
...
  • どういうことかというと
  • 例外処理はあくまで開発者向けに作られたものであるという大前提
  • つまり、**ログに出すメッセージは「開発者に関係ないことは出力しない」**のが正しい
    • この前提に立つと、ここでログにでている「ユーザーは取得できませんでした。」はユーザー向けのメッセージであり開発者が読むには、ちと邪魔になる
      • この読みづらさを「汚している」と表現した、ということ
      • 開発者としては、運用時のシステム障害時にもっと具体的な詳細が欲しいところ
        • 今回であれば取得できないユーザーのID情報などが欲しい、など
  • ということで以下のコードに書き変えた

👇after:修正版

class LogController extends Controller
{
    public function index()
    {
        try {
            // エラー発生した時の処理
            throw new Exception();
        } catch(Exception $e) {
            Log::error($e);
            return redirect()->route('log.index')
				// セッションにerrorというキーでメッセージを渡し、遷移先でエラーメッセージを出力
                ->withErrors(['error'=>'ユーザー情報が取得できませんでした']);
        }
    }
}
  • 再びlaravel.logを確認すると
[2021-12-11 07:40:41] local.ERROR: Exception in C:\xampp\htdocs\basic_laravel\app\Http\Controllers\LogController.php:17
Stack trace:
  • おお、最低限のログしか残らず(「ユーザーは取得できませんでした。」)、ログを汚さなくなった!

所見

  • 当時は新規プロジェクトの開発しかやっておらず運用経験がないので、ログを見るという習慣があまりなかった

    • 「ログがどうなっているか」という点はあまり気にしたことなかったですね
    • Laravelであれば、ブラウザ上のエラーメッセージやデバッグバーでエラーの内容は大体わかるので、laravel.logを見ることはあまりない、、、
  • ただここからは自戒。

  • そもそも、自分でLog::を実装しているなら、自分で意図したLogが出力されるかはちゃんと確認しろよ…と我ながら思いました…

    • 自戒になりますが、「新規開発であってもちゃんとログは見よう」
    • もっと言うと**「自分の書いたコードには責任を持とう。」**
  • 内容自体は非常に当たり前で薄いものですが、個人的に上の2つの教訓を日々の開発の中で習慣化できたきっかけだったので、記事にしました!

最後までお読みいただきありがとうございました!

10
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?