5
2

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.

ログの仕込み方について考えてみる

Last updated at Posted at 2021-12-07

最近案件で学んだのでまとめてみます。

PHPやRubyで開発していると、「データが無い」エラーとか、シンタックスエラーとかよしなに出してくれますよね。

そこで、ログ周りを実装する場合の自分なりの観点をまとめていきたいと思います。

※例として、LaravelのLogファサードを使用しています。適宜読み替えていただければと思います。

そもそも何でログが必要なの?

これは、人それぞれ観点があると思いますが、僕は主に「トラブルシューティング」の際に役立つと考えています。
想定外のエラーが起きた時、「誰が」「いつ」「何をしようとして」「結果どうなったか」
ということをログから特定することによって、エラー原因の解消に役立ちます。

ログ出力(修正前)

public function createAction(){
  // フォームから入力された内容を取得(省略)

  try {
    // Articleテーブルにレコード登録
    $article_repository = new ArticleRepository();
    $article_repository->save($入力値);
  } catch (\Exception $e) {
    Log::error('エラーが起きました');
  }
}

これだと、保存に失敗した時に「エラーが起きました」としか出てこないので、原因の特定ができません。
「誰が」「何をしようとして」「結果どうなったか」を意識してみます。

ログ出力(修正後)

public function createAction(){
  // フォームから入力された内容を取得(省略)

  // 操作をしたユーザー取得
  $account_name(操作をしたユーザーを入れておく)
  // ユニークキー取得
  $unique_key = uniqid('', true);

  Log::info('operation_createAction',
      [
          'operation' => [
              'operator' => $account_name,
              'opetation' => 'Create Article',
              'controller' => 'ArticleController',
              'action' => 'createAction',
              'status' => 'before doing',
              'unique_key' => $unique_key,
          ],
          'request' => [
              'user_id' => $user_id,
              'text' => $text
          ],
      ]
  );


  try {
    // Articleテーブルにレコード登録
    $article_repository = new ArticleRepository();
    $article_repository->save($入力値);
  } catch (\Exception $e) {
      Log::error('error_createAction',
          [
              'operation' => [
                  'operator' => $account_name,
                  'opetation' => 'Create Article',
                  'controller' => 'ArticleController',
                  'action' => 'createAction',
                  'status' => 'failed',
                  'unique_key' => $unique_key,
              ],
              'error' => [
                  'exception_message' => $e->getMessage(),
              ],
          ]
      );
  }
}

※ログの時刻は自動で設定されるので省略しています

  • 「誰が」「何をしようとして」「結果どうなったか」を意識してみました。
  • 「誰が」の部分には、operatorを入れています
  • 「何をしようとして」の部分には、operation,requestを記載しています。
  • 「結果どうなったか」の部分には、errorに記載しています

これにより、どのコントローラーで、何を保存しようとしてエラーが起きたのかを特定することができます。

  • ユニークキーを設定することによって、操作前から操作後の一連の操作をユニークキーで検索することができます。
「どんな時にログが使われるか」
「誰が」「何をしようとして」「結果どうなったか」

を意識するとログの精度をより高めることができると思います。

5
2
0

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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?