Laravelでログを出す方法やある処理を実行したときのデータログを出力させたい時にどうすればいいんだろう…?
こんな疑問を解決します。
この記事では以下のように画面ログやデータログなどを出力させることをゴールとします。
ログの共通化なども解説しているので、アプリ開発の参考にしてください。
[2021-10-23 11:54:19] local.INFO: 出力画面: 本の一覧画面, 結果: 表示成功
[2021-10-24 13:33:31] local.INFO: 出力箇所: 本の登録処理, 動作: リクエストデータ
[2021-10-24 13:33:31] local.INFO: array (
'book_name' => 'ログテスト',
'user_id' => '1',
'category_id' => '1',
'book_min_price' => '100',
'book_max_price' => '1000',
)
ログの出力をアプリに実装しておけば、どこまで処理ができているのかわかります。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
動作環境・前提
Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール phpmyadmin
また、ログ関連のロジックはapp\Services\logService.phpを作成して、そこに記述していきます。
そもそもLaravelでログを出力させるには?やログ出力のロジックはserviceクラスに書いていくので、Laravelでserviceクラスの作成手順などがわからないって方は、以下の記事を参考にしてください。
Laravelでログを出力させる方法について
以下で簡単に解説していますので参考にしてみてください。
①Laravelでログを出力させるロジックを作成する
ログを出力するロジックを書いていきます。ログには以下のように出力されるようになります。
ここでは、どの画面が表示成功されているか確認するログとなります。
[2021-10-23 11:54:19] local.INFO: 出力画面: 本の一覧画面, 結果: 表示成功
それでは書いていきましょう。
<?php
namespace App\Services;
use Illuminate\Support\Facades\Log;
/**
* ログ関連サービス
*/
class LogService
{
/**
* 画面ログの出力を行う
*
* @param string $view 画面・処理名
* @param string $action 動作・挙動 成功/失敗
*/
public function screenLog($view, $action)
{
$result = '出力箇所: '.$view.', 動作: '.$action;
Log::info($result);
}
}
コントローラーで呼び出す
<?php
namespace App\Http\Controllers;
use App\Models\Book;
use Illuminate\Support\Facades\Log;
use App\Services\logService;
class BookController extends Controller
{
private $log;
public function __construct()
{
$this->book = new Book();
$this->log = new LogService();
}
/**
* 一覧画面
*/
public function index()
{
// 画面ログ
$this->log->screenLog('本の一覧画面', '表示成功');
// 本の一覧データを取得
$books = $this->book->findAllBooks();
return view('book.index', compact('books'));
}
本の一覧画面に遷移して、ログが表示されるか確認すると以下のようにログが出力されました。
[2021-10-23 11:54:19] local.INFO: 出力画面: 本の一覧画面, 結果: 表示成功
画面ログがあれば、どこまで処理が実行できているのか確認できるので、エラーを探すのに便利です。
②Laravelでリクエストのデータログを出力させる
登録処理でリクエストされたデータのログも出力させてみます。
/**
* リクエストデータログの出力を行う
*
* @param string $view 画面・処理名
* @param string $action 動作・挙動 成功/失敗
* @param string $data リクエストデータ
*/
public function requestLog($view, $action, $data)
{
$result = '出力箇所: '.$view.', 動作: '.$action;
Log::info($result);
// 配列
Log::info($data);
}
コントローラーで呼び出します。
/**
* 登録処理
*/
public function store(BookRequest $request)
{
// 画面ログ
$this->log->requestLog('本の登録処理', 'リクエストデータ', $request->all());
return redirect()->route('book.index');
}
$request->all()とすることで、フォームでリクエストした内容を全て取得できます。
画面ログとリクエストデータも出力できました。
[2021-10-24 13:33:31] local.INFO: 出力箇所: 本の登録処理, 動作: リクエストデータ
[2021-10-24 13:33:31] local.INFO: array (
'book_name' => 'ログテスト',
'user_id' => '1',
'category_id' => '1',
'book_min_price' => '100',
'book_max_price' => '1000',
)
③Laravelで登録処理した際にDBのログを出力する
今度は登録処理した際に、データベースの値をログに出力させます。
/**
* 更新対象データ / 登録されたデータ 等のDBのデータをログに出力
*
* @param string $view 画面・処理名
* @param string $action 動作・挙動 成功/失敗
* @param mixed $data 出力するデータ
*/
public function dbDataLog($view, $action, $data)
{
$result = '出力箇所: '.$view.', 動作: '.$action;
Log::info($result);
// toArratせず出力すると、ユニコード変換されてしまうため。
Log::info($data->toArray());
}
$registerBookは登録処理になります。
/**
* 登録処理
*/
public function store(BookRequest $request)
{
// 画面ログ
$this->log->requestLog('本の登録処理', 'リクエストデータ', $request->all());
// リクエストされた本の名称
$bookName = $request->book_name;
// リクエストされたデータを元に登録処理を実行
$registerBook = $this->book->InsertBooK($request);
// データログ
$this->log->dbDataLog('本の登録処理', 'データ登録成功', $registerBook);
return redirect()->route('book.index');
}
このように登録処理に成功したときに、データベースに登録した値をログに出力できました。
[2021-10-24 13:54:44] local.INFO: 出力箇所: 本の登録処理, 動作: データ登録成功
[2021-10-24 13:54:44] local.INFO: array (
'user_id' => '1',
'category_id' => '1',
'book_name' => 'テストデータログ',
'book_min_price' => '100',
'book_max_price' => '500',
'image_file_path' => NULL,
'updated_at' => '2021-10-24T04:54:44.000000Z',
'created_at' => '2021-10-24T04:54:44.000000Z',
'book_id' => 26,
)
④Laravelで開始:終了のログを呼び出す
関数が実行される時の開始ログと終了ログのサンプルになります。
以下はコントローラーです。
<?php
namespace App\Http\Controllers;
use App\Services\LogService;
class InfoController extends Controller
{
private $logService;
public function __construct(LogService $logService)
{
$this->logService = $logService;
}
public function index()
{
// ログ開始
$this->logService->startLog(__METHOD__);
$bookName = 'Laravel勉強会';
// ログ終了
$this->logService->endLog(__METHOD__);
}
}
以下はログのサービスクラスです。
<?php
namespace App\Services;
use Illuminate\Support\Facades\Log;
/**
* ログ関連サービス
*/
class LogService
{
/**
* 共通ログ開始の出力を行う
*/
public function startLog($method)
{
Log::info('ログ開始:' . $method);
}
/**
* 共通ログ終了の出力を行う
*/
public function endLog($method)
{
Log::info('ログ終了:' . $method);
}
}
実際のログは以下のように出力されます。
[2023-11-16 16:07:02] local.INFO: ログ開始:App\Http\Controllers\InfoController::index
[2023-11-16 16:07:02] local.INFO: ログ終了:App\Http\Controllers\InfoController::index
開始ログにデータも含ませる場合
開始ログにアプリで必要なリクエストデータも出力したい場合は以下のようにできます。
リクエストデータは仮に以下のように店舗コード、ユーザーID、オーダーIDがあるとします。
public function index(Request $request)
{
$request->store_code = '111';
$request->user_id = 'hogehoge01';
$request->order_id = '49FF0';
// ログ開始
$this->logService->startLog($request, __METHOD__);
$bookName = 'Laravel勉強会';
// ログ終了
$this->logService->endLog(__METHOD__);
}
開始ログのコードです。
/**
* 共通ログ開始の出力を行う
*
* @param object $data リクエストデータ
* @param string $method メソッド
*/
public function startLog($data, $method)
{
Log::info('ログ開始:', [
'store_code' => $data->store_code,
'user_id' => $data->user_id,
'order_id' => $data->order_id,
'method' => $method
]);
}
ログの出力結果は以下のようになります。
[2023-11-16 16:41:29] local.INFO: ログ開始: {"store_code":"111","user_id":"hogehoge01","order_id":"49FF0","method":"App\\Http\\Controllers\\InfoController::index"}
⑤Laravelでエラーログを記載する
最後にエラーログについても解説します。
エラーが発生した時に原因がわかるように以下のような形式でログを出力することを目指します。
[2023-11-17 02:32:23] local.ERROR: データ取得時にエラーが発生しました。store_code: 111 user_id: hogehoge01 order_id:49FF0
コードはこんな感じです。
try catchでエラーが発生した時にLog::errorを使ってエラーログを出力させます。
出力するのは、メソッド、ログ詳細などです。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\LogService;
use Illuminate\Support\Facades\Log;
class InfoController extends Controller
{
private $logService;
public function __construct(LogService $logService)
{
$this->logService = $logService;
}
public function index(Request $request)
{
$request->store_code = '111';
$request->user_id = 'hogehoge01';
$request->order_id = '49FF0';
// ログ開始
$this->logService->startLog($request, __METHOD__);
try {
abort(500);
} catch (\Exception $e) {
Log::error("メソッド:" . __METHOD__);
Log::error(config('error.text1') . "store_code: {$request->store_code} user_id: {$request->user_id} order_id:{$request->order_id}");
Log::error($e->getMessage());
}
// ログ終了
$this->logService->endLog(__METHOD__);
}
}
error.text1はconfigファイルにconfig>error.phpを作成してそこに記載します。
<?php
return [
'text1' => 'データ取得時にエラーが発生しました。',
];
コードを実行すると以下のようにエラーログがstorage>logs>laravel.logに出力されます。
[2023-11-17 02:32:23] local.ERROR: メソッド:App\Http\Controllers\InfoController::index
[2023-11-17 02:32:23] local.ERROR: データ取得時にエラーが発生しました。store_code: 111 user_id: hogehoge01 order_id:49FF0
[2023-11-17 02:32:23] local.ERROR: (Laravelから返ってくる詳細なエラー内容が記載)
【まとめ】画面ログやデータのログを出力させる方法
今回は、画面ログやデータログの出力について解説しました。
アプリを開発しているときにエラーの原因を探しやすくするので、ぜひ参考にしてみてください。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント