Laravelでログが出ない・500エラー時に出力されない原因と解決策|storage権限・.env・Nginx設定

運用・保守・セキュリティ

Laravelで開発や運用を行っている際、ブラウザに「500 Server Error」が表示されているにもかかわらず、storage/logs/laravel.log に何もエラーログが記録されない(あるいはログファイル自体が生成されない)という現象に遭遇することがあります。

エラーログが出力されないと、何が原因でサーバーエラーが発生しているのか手がかりが掴めず、復旧に時間がかかってしまいます。この問題は、「Laravelのロギング機構が起動する前のレイヤーで停止している」か、「ログを書き込む権限・設定に不整合がある」ことが主な原因です。

本記事では、Laravelで500エラー時にログが出ない原因を体系的に整理し、最短で原因を特定するためのトラブルシューティング手順と具体的な解決策を詳しく解説します。

  1. 【最短診断】ログが出ない時のトラブルシューティング手順
  2. Laravelで500エラー時にログが出ない主な原因と解決策
    1. 1. Laravelブートストラップ前のPHP致命的エラー(Fatal Error / Syntax Error)
      1. 解決策:WebサーバーやPHP-FPMのエラーログを直接確認する
    2. 2. storageディレクトリの権限(パーミッション・所有者)の問題
      1. よくある原因:artisanコマンド実行による所有者不一致
      2. 解決策:所有者とパーミッションの適切な設定
    3. 3. 設定キャッシュ(config:cache)の不整合
      1. 解決策:設定キャッシュをクリアする
    4. 4. ログレベル(LOG_LEVEL)やログチャネルの設定ミス
      1. 解決策:.envの設定を見直す
    5. 5. 例外ハンドラ内での握りつぶしやクラッシュ
      1. Laravel 11以降(bootstrap/app.php)での確認
      2. Laravel 10以前(app/Exceptions/Handler.php)での確認
    6. 6. Webサーバー(Nginx / Apache)の設定や .htaccess の誤り
      1. 解決策:到達確認(dieテスト)を行う
  3. 本番環境でトラブルシューティングを行う際の注意点
  4. よくある質問(FAQ)
    1. Q. storage/logs/laravel.log がそもそも作成されないのはなぜですか?
    2. Q. artisanコマンド実行時はログが出るのに、ブラウザからアクセスすると出ないのはなぜ?
    3. Q. Laravel 11で例外ログのカスタマイズはどこで行いますか?
    4. Q. 共有レンタルサーバー(Xserver等)でログを確認するには?
  5. まとめ
  6. 関連記事

【最短診断】ログが出ない時のトラブルシューティング手順

500エラーが発生しているのにLaravelのログが出ないときは、以下のステップ順に確認を進めることで、原因の箇所を迅速に絞り込むことができます。

  1. Webサーバー / PHP-FPMのエラーログを確認する(最優先): Laravelが起動する前のFatal ErrorやWebサーバーエラーを特定します。
  2. storage/ ディレクトリのパーミッションと所有者を確認する: Webサーバー実行ユーザーに書き込み権限があるか確認します。
  3. 設定・ルートのキャッシュをクリアする: php artisan config:clear を実行し、古い設定のキャッシュを排除します。
  4. public/index.php にデバッグコードを挟んで到達確認を行う: リクエストがLaravelのエントリポイントまで届いているか検証します。
  5. 環境変数(.env)のログレベルとデバッグ設定を見直す: ログレベル(LOG_LEVEL)でエラーがフィルタリングされていないか確認します。

Laravelで500エラー時にログが出ない主な原因と解決策

1. Laravelブートストラップ前のPHP致命的エラー(Fatal Error / Syntax Error)

Laravelは、public/index.php から Composer のオートローダーを読み込み、サービスプロバイダやロギングサービス(Monolog)を初期化して初めて storage/logs/laravel.log にログを書き込めるようになります。

そのため、以下のような「Laravel起動前」に発生したエラーは、Laravelのログファイルには一切出力されません。

  • .env ファイルの構文ミス(引用符の閉じ忘れなど)
  • bootstrap/app.phpconfig/ ディレクトリ内の設定ファイルでの構文エラー(Syntax Error)
  • PHP拡張モジュール(PDO, mbstring, OpenSSL等)の不足
  • PHPバージョンの不一致による構文非対応
  • composer.json の更新後に composer dump-autoload を実行していないことによるクラス読み込み失敗

解決策:WebサーバーやPHP-FPMのエラーログを直接確認する

Laravel起動前のエラーは、Webサーバー(Nginx / Apache)または PHP-FPM のエラーログに必ず記録されています。サーバーにSSH接続し、リアルタイムでログを監視しながらアクセスしてください。

# Nginxのエラーログ
tail -f /var/log/nginx/error.log

# Apacheのエラーログ(Ubuntu / Debian系)
tail -f /var/log/apache2/error.log

# Apacheのエラーログ(RHEL / CentOS / AlmaLinux系)
tail -f /var/log/httpd/error_log

# PHP-FPMのエラーログ
tail -f /var/log/php-fpm/www-error.log
# または
tail -f /var/log/php8.2-fpm.log

構文エラーが疑われる場合は、以下のコマンドでPHPファイルの文法チェックを実行することも有効です。

php -l bootstrap/app.php
php -l config/app.php
composer dump-autoload

2. storageディレクトリの権限(パーミッション・所有者)の問題

Laravelのログ出力先である storage/logs や、フレームワークのキャッシュ先である bootstrap/cache に対してWebサーバープロセス(www-data, nginx, apache など)の書き込み権限がない場合、Laravelはログファイルを作成・追記できません。ログ書き込み処理自体がパーミッションエラーで失敗するため、結果として500エラー画面だけが表示され、ログは何も残りません。

よくある原因:artisanコマンド実行による所有者不一致

SSH上で root や一般ユーザー(ubuntu など)として php artisan コマンドを実行すると、ログファイル(例: laravel-2026-08-15.log)がそのユーザーの所有権で作成されます。その後、ブラウザ経由でWebサーバー(www-data)からリクエストが来ると、所有者が異なるためログファイルに追記できず、ログが出なくなります。

解決策:所有者とパーミッションの適切な設定

以下のコマンドで、storage および bootstrap/cache の所有者をWebサーバー実行ユーザーに変更し、適切な書き込み権限を付与します。

# 所有者をWebサーバーユーザーに変更(Ubuntu/Debian系の場合: www-data)
sudo chown -R www-data:www-data storage bootstrap/cache

# ディレクトリとファイルの権限を付与
sudo chmod -R 775 storage bootstrap/cache

また、config/logging.php 内でログチャネルのファイルパーミッションを明示的に指定しておくことで、新規ログファイル作成時の権限トラブルを防止できます。

'daily' => [
    'driver' => 'daily',
    'path' => storage_path('logs/laravel.log'),
    'level' => env('LOG_LEVEL', 'debug'),
    'days' => 14,
    'permission' => 0666, // 全ユーザーに読み書き権限を付与
],

3. 設定キャッシュ(config:cache)の不整合

本番環境などで php artisan config:cache を実行している場合、Laravelは .env ファイルを直接読まず、bootstrap/cache/config.php にまとめられたキャッシュ設定のみを参照します。

この状態で .env ファイルの環境変数(データベース接続先、ログ設定、APP_KEYなど)を変更しても反映されず、古い無効な設定のまま動作して500エラーが発生することがあります。

解決策:設定キャッシュをクリアする

設定や環境変数を変更した際は、必ずキャッシュクリアコマンドを実行してください。

# 設定キャッシュをクリア
php artisan config:clear

# アプリケーション全体のキャッシュをクリア
php artisan cache:clear
php artisan route:clear
php artisan view:clear

4. ログレベル(LOG_LEVEL)やログチャネルの設定ミス

Laravelのログ設定(config/logging.php)や .env の設定によって、エラーログが出力対象外になっているケースがあります。

  • LOG_LEVEL が高すぎる: .envLOG_LEVEL=emergencycritical に設定されている場合、一般的な errorwarning レベルのログは除外されます。
  • ログチャネルが null または無効: LOG_CHANNEL=null や存在しないドライバが指定されていると、ログはどこにも保存されません。

解決策:.envの設定を見直す

開発中やトラブル調査時は、.env のログレベルを debug に設定し、確実にログが記録されるようにします。

APP_ENV=local
APP_DEBUG=true
LOG_CHANNEL=stack
LOG_LEVEL=debug

5. 例外ハンドラ内での握りつぶしやクラッシュ

Laravelでは発生した例外を例外ハンドラでキャッチしてログ出力を行いますが、例外ハンドラ自体の処理に問題があるとログが出力されません。

  • 例外ハンドラ内で別の例外が発生している: ログ出力の前後でカスタム処理(データベース保存や外部通知など)を実行しており、そこで例外がスローされると全体の処理が中断してログファイルへの書き込みまで到達しません。
  • 意図しない例外の抑制: dontReport プロパティや stop() メソッドで対象の例外がレポート対象外に指定されている。

Laravel 11以降(bootstrap/app.php)での確認

Laravel 11以降では従来の app/Exceptions/Handler.php が廃止され、bootstrap/app.phpwithExceptions() メソッド内で設定を行います。

// bootstrap/app.php (Laravel 11 / 12)
->withExceptions(function (Exceptions $exceptions) {
    // レポート対象外(dontReport)に指定されていないか確認
    // $exceptions->dontReport(CustomException::class);
    
    // カスタムレポート処理内でエラーが起きていないか確認
    $exceptions->report(function (Throwable $e) {
        // ここでエラーが発生するとログが出力されなくなる可能性がある
    });
})

Laravel 10以前(app/Exceptions/Handler.php)での確認

Laravel 10以前の場合は、app/Exceptions/Handler.php$dontReport 配列や register() メソッドの内容を確認してください。

6. Webサーバー(Nginx / Apache)の設定や .htaccess の誤り

PHPの実行以前に、Webサーバー自体が500 Internal Server Errorを返しているケースです。この場合、リクエストはPHP(Laravel)まで到達していないため、Laravelのログには記録されません。

  • Apacheの場合: public/.htaccess 内に不正なディレクティブが記述されている、または mod_rewrite が有効化されていない。
  • Nginxの場合: fastcgi_pass のソケットパスやポート番号が間違っており、PHP-FPMに接続できない(502 Bad Gatewayや500エラー)。

解決策:到達確認(dieテスト)を行う

リクエストがPHPまで到達しているかを検証するため、public/index.php の最上部に一時的にテストコードを記述してみます。

<?php
// public/index.php の先頭に追加
die('PHP is working!');

use Illuminate\Http\Request;
...
  • ブラウザに 「PHP is working!」 と表示される場合 → WebサーバーとPHPの連携は正常であり、Laravelの初期化・内部コードに原因があります。
  • ブラウザに依然として 「500 Internal Server Error」 が表示される場合 → Webサーバー(Nginx/Apache/.htaccess)またはPHP-FPMの設定に原因があります。

※確認後は必ず追加した die(...) 行を削除してください。

本番環境でトラブルシューティングを行う際の注意点

本番環境でログが出ない問題を調査する際は、セキュリティとユーザー影響に十分配慮してください。

  • APP_DEBUG=true の放置禁止: デバッグモードを true にすると、環境変数やデータベースのパスワードなどの機密情報が画面上に露出する重大なセキュリティリスク(情報漏洩)につながります。一時的に有効化して確認した後は、必ず APP_DEBUG=false に戻し、php artisan config:clear を実行してください。
  • 外部エラー監視ツールの導入検討: サーバーログに依存しないエラー監視を実現するために、Sentry、Bugsnag、Flareなどの外部エラートラッキングサービスを導入することをお勧めします。PHPクラッシュ時でも外部へアラートを送信できるため、障害の早期検知に役立ちます。

よくある質問(FAQ)

Q. storage/logs/laravel.log がそもそも作成されないのはなぜですか?

storage/logs ディレクトリの書き込み権限がWebサーバーユーザー(www-data など)にないか、.envLOG_CHANNEL 設定が無効になっている可能性が高いです。sudo chown -R www-data:www-data storage および sudo chmod -R 775 storage を実行してパーミッションを修正してください。

Q. artisanコマンド実行時はログが出るのに、ブラウザからアクセスすると出ないのはなぜ?

コマンドライン(CLI)実行ユーザーとWebサーバー実行ユーザーの権限の違いが原因です。artisanコマンドで作成されたログファイルの所有権が一般ユーザーになっていると、Webサーバープロセスから書き込めなくなります。所有者を www-data に統一するか、config/logging.phppermission 設定を 0666 に設定してください。

Q. Laravel 11で例外ログのカスタマイズはどこで行いますか?

Laravel 11以降では app/Exceptions/Handler.php が廃止され、bootstrap/app.phpwithExceptions() メソッド内で例外のレポートや描画設定を行います。

Q. 共有レンタルサーバー(Xserver等)でログを確認するには?

SSHが利用できないレンタルサーバーの場合は、サーバーの管理パネルにある「エラーログ」機能からApache/Nginxのエラーログをダウンロードして確認してください。

まとめ

Laravelで500エラーが発生しているのにログが出ない場合、慌てずにレイヤーごとの切り分けを行うことが解決への最短ルートです。

  1. まず Webサーバー・PHP-FPMのエラーログ/var/log/nginx/error.log 等)を確認する
  2. storage/logs のパーミッション・所有者www-data に統一する
  3. php artisan config:clear で設定キャッシュの不整合を解消する
  4. public/index.php への到達確認 でWebサーバー層とLaravel層を切り分ける

これらの手順を踏むことで、原因不明の500エラーでも確実に原因を特定して復旧することができます。

500エラー全般の基本的な原因や解決手順についてはLaravel 500エラーの原因と解決策:初心者向け完全ガイド、例外処理の詳細な仕組みについてはLaravelでの例外処理をマスターする方法、設定キャッシュのクリアコマンドについてはphp artisan config:cache の使い方もあわせて参考にしてください。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント