最近案件で学んだのでまとめてみます。
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
に記載しています
これにより、どのコントローラーで、何を保存しようとしてエラーが起きたのか
を特定することができます。
- ユニークキーを設定することによって、操作前から操作後の一連の操作をユニークキーで検索することができます。
「どんな時にログが使われるか」
「誰が」「何をしようとして」「結果どうなったか」
を意識するとログの精度をより高めることができると思います。