Laravelのログファイルの見方と保存先を徹底解説!storage/logsの使い方を初心者向けにガイド
生徒
「Laravelでエラーが出たときに原因を調べたいのですが、どこを見ればいいですか?」
先生
「そういうときはログファイルを確認するのが一番の近道です。Laravelは動いた記録をすべてファイルに残してくれていますよ。」
生徒
「ログファイルってどこにあって、どうやって読めばいいんですか?」
先生
「保存場所から読み方、自分でログを書き込む方法まで、順を追って説明しますね!」
1. ログファイルとは何か?なぜ大切なのか
プログラムを動かしていると、正常に動いているときも、エラーが起きたときも、さまざまな出来事が発生します。その出来事の記録を残したものがログファイルです。
ログとは「航海日誌」という意味の英語が語源で、船がどこを通ったかを記録するように、プログラムがどんな処理をしたかを記録するものです。たとえば「いつ」「どんなエラーが」「どのファイルの何行目で」起きたかといった情報が書き込まれます。
開発中に画面がエラーになったり、本番環境(実際にユーザーが使う環境)でおかしな動きがあったりしたとき、ログファイルを見ることで原因の手がかりをつかめます。ログファイルはプログラマーにとって「事件の目撃者」のような存在で、何が起きたのかをあとから確認するために欠かせないものです。
2. Laravelのログファイルの保存場所
Laravelのログファイルはstorage/logsというフォルダの中に保存されます。プロジェクトのルートフォルダ(プロジェクト全体の一番上の階層)から数えるとプロジェクト名/storage/logs/というパスになります。
パスとは、ファイルやフォルダがどこにあるかを示す住所のようなものです。
ログファイルのデフォルト(初期設定)のファイル名はlaravel.logです。設定によっては日付ごとにファイルが分かれてlaravel-2025-06-01.logのような名前になることもあります。このファイルをテキストエディタ(文字を編集するソフト)で開くと、ログの中身を確認できます。
ターミナル(文字を打ち込んでパソコンに命令する画面)を使って確認する場合は、以下のコマンドでログの最新の内容を表示できます。
// ターミナルで実行するコマンド(ログの最後の50行を表示する)
tail -n 50 storage/logs/laravel.log
tailはファイルの末尾を表示するコマンドで、-n 50は「最後の50行」という指定です。ログは新しいものほどファイルの下に追加されていくため、末尾を見ることで最新のエラー情報を確認できます。
3. ログファイルの中身の読み方
実際にログファイルを開くと、以下のような形式で記録されています。最初は英語ばかりで戸惑うかもしれませんが、構造を知ると読みやすくなります。
[2025-06-01 10:23:45] local.ERROR: SQLSTATE[HY000] [2002] Connection refused
{"exception":"[object] (PDOException(code: 2002):
at /var/www/html/vendor/laravel/framework/src/...
ログの各行は基本的に日時・環境名・ログレベル・メッセージという構成になっています。
日時は[2025-06-01 10:23:45]のようにいつ起きたかを示します。その次のlocalは動作環境の名前(開発環境か本番環境かなど)です。ERRORの部分がログレベルと呼ばれるもので、そのメッセージがどの程度重要かを示します。そのあとにコロンで続くのが実際のエラーメッセージです。
ログレベルには重要度の高い順にemergency、alert、critical、error、warning、notice、info、debugがあります。エラーを調査するときはまずERRORやCRITICALのレベルのものを重点的に確認するとよいでしょう。
4. Logファサードを使って自分でログを書き込む方法
Laravelでは自分のコードの中にログを書き込む命令を入れることができます。これを使うと「ここでこんな処理が行われた」「このときの変数の中身はこれだった」という記録を自由に残せるため、バグを調べるときにとても役立ちます。
ログを書き込むにはLogファサードを使います。ファサードとはLaravelの便利な機能をシンプルに呼び出せる仕組みのことで、難しい内部処理を意識せずに使えるようにしてくれるものです。
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function store(Request $request)
{
$orderId = $request->input('order_id');
// 注文IDをinfoレベルでログに記録する
Log::info('注文処理を開始しました。注文ID: ' . $orderId);
// 処理の途中で警告を記録する例
if ($orderId > 9999) {
Log::warning('注文IDが想定より大きい値です。ID: ' . $orderId);
}
return response()->json(['message' => '注文を受け付けました。']);
}
}
Log::info()は情報として記録するメソッド、Log::warning()は警告として記録するメソッドです。このように処理の流れに合わせてログを仕込んでおくと、何か問題が起きたときにどこまで処理が進んでいたかを確認できます。
5. ログの設定ファイルとチャンネルについて
Laravelのログの動作はconfig/logging.phpという設定ファイルで管理されています。この中でログをどのように保存するかを決めるチャンネルという概念があります。チャンネルとは「ログをどのルートで、どんな形式で保存するか」を決めた設定のことです。
デフォルトのチャンネルは.envファイルのLOG_CHANNELという項目で指定されています。.envファイルとは、データベースの接続情報やアプリの動作設定をまとめた環境設定ファイルです。
よく使われるチャンネルの種類として、single(すべてのログを1つのファイルに書き込む)とdaily(日付ごとにファイルを分けて書き込む)があります。開発環境ではsingleでも問題ありませんが、本番環境ではdailyにしてファイルを日付で分けると管理がしやすくなります。
// .envファイルの設定例
// single: 1つのファイルにまとめて記録する
LOG_CHANNEL=single
// daily: 日付ごとにファイルを分けて記録する
LOG_CHANNEL=daily
dailyに設定すると、storage/logs/laravel-2025-06-01.logのように日付つきのファイル名で保存されます。古いファイルが自動的に削除されるようにLOG_DAILY_DAYSで保存日数を指定することもできます。
6. ログにコンテキスト情報を追加して詳しく記録する方法
ログにはメッセージだけでなく、配列(複数のデータをひとまとめにしたもの)の形で追加情報を一緒に記録することができます。これをコンテキストといいます。コンテキストを加えると「どのユーザーが」「どんな状況で」といった詳細をセットで残せるため、原因調査がさらにしやすくなります。
<?php
use Illuminate\Support\Facades\Log;
public function login(Request $request)
{
$email = $request->input('email');
// ログイン試行をコンテキスト付きで記録する
Log::info('ログイン試行がありました。', [
'email' => $email,
'ip_address' => $request->ip(),
'user_agent' => $request->userAgent(),
]);
// ログイン失敗時はerrorレベルで記録する
if (!auth()->attempt(['email' => $email, 'password' => $request->input('password')])) {
Log::error('ログインに失敗しました。', [
'email' => $email,
]);
return back()->withErrors(['email' => 'メールアドレスまたはパスワードが正しくありません。']);
}
return redirect('/dashboard');
}
Log::info()の第二引数(2番目に渡す値)に配列を渡すことで、ログファイルにはメッセージと一緒にその配列の内容も記録されます。$request->ip()はアクセス元のIPアドレス(インターネット上の住所のようなもの)を取得するメソッドです。このようにコンテキストを充実させておくことで、不正アクセスや不具合が起きたときの調査効率が大幅に上がります。
7. ログファイルが肥大化しないようにする管理のポイント
ログファイルはアプリが動き続けるほどどんどん内容が追加されていくため、放置するとファイルサイズがとても大きくなってしまいます。ファイルが大きくなりすぎるとサーバーのディスク容量(データを保存できる容量)を圧迫する原因になります。
この問題を防ぐためにLaravelにはdailyチャンネルを使って古いログを自動削除する機能があります。config/logging.phpの中でdaysという項目に日数を指定すると、その日数より古いログファイルは自動的に削除されます。
<?php
// config/logging.phpの設定例(dailyチャンネルの保存日数を設定)
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14, // 14日分だけ保持して古いものは自動削除
],
],
上記の設定では14日間分のログファイルを残し、それより古いものは削除されます。本番環境では不要なデバッグ情報がログに大量に記録されないよう、.envファイルのLOG_LEVELをerrorやwarningに設定しておくことも重要です。LOG_LEVELとは、どのレベル以上のログを記録するかを決める設定で、errorに設定するとエラー以上の重大なものだけが記録されます。開発中はdebugにして詳しく記録し、本番公開時には絞り込むというのが一般的な使い方です。