Laravel『Error Logging Issues(ログが出ない/記録できない)』の原因と対処法outlookのようなサーバーにあるメッセージを14日間以外は削除して、保存するような仕組みをプログラムで作成できる?pythonで作ってほしいです。

Laravel『Error Logging Issues(ログが出ない/記録できない)』の原因と対処法outlookのようなサーバーにあるメッセージを14日間以外は削除して、保存するような仕組みをプログラムで作成できる?pythonで作ってほしいです。

Laravelの「Error Logging Issues」は、例外やLog::error()を出しているのにログが増えない、ログファイルが作られない、ログが途中で止まる、スタックトレースが出ない、といった“ログ記録の不具合”全般を指すことが多い。原因は大きく「設定(LOG_CHANNEL/stack)」「書き込み権限・パス」「設定キャッシュの不整合」「ログローテーション/容量枯渇」「本番の標準出力/コンテナ設計」「例外ハンドラで握り潰している」の層に分かれる。最初に“Laravelがどのチャネルへ出そうとしているか”と“その出力先が実際に書ける状態か”を確定させる。

症状と発生条件(典型例)

発生条件の典型:
・storage/logs/laravel.log が作られない/更新されない
・Log::info() を呼んでも何も出ない
・例外が画面に出るがログには残らない(または逆)
・本番だけログが出ない(config:cache、権限、コンテナのstdout運用差)
・しばらく動くとログが止まる(ディスクフル、権限変更、ローテーション設定不備)
ログ周りで見かけるメッセージ例:

The stream or file ".../storage/logs/laravel.log" could not be opened: Permission denied
No such file or directory
Disk quota exceeded
Unable to create the log directory

まず確認:LOG_CHANNEL と実際の出力先(config/logging.php)

Laravelは LOG_CHANNEL(デフォルトは stack)で出力先を切り替える。
確認ポイント:
・.env の LOG_CHANNEL / LOG_LEVEL
・config/logging.php の channels 定義(single/daily/stack/errorlog/slack など)
.env を変えたら、設定キャッシュが残っていないかも確認対象。

php artisan config:clear
php artisan cache:clear

本番で最適化運用なら、クリア後に config:cache を再生成する。

原因1:LOG_CHANNEL の指定ミス(存在しないチャネル名、stackの中身が空)

発生条件:
・LOG_CHANNEL=stak のようなtypo
・独自チャネル名にしたが config/logging.php に定義がない
・stack が参照する channels が空/誤っている
対処:
・まずは確実に出る “single” か “daily” に固定して確認する

# .env
LOG_CHANNEL=single
LOG_LEVEL=debug

stack を使う場合は、stack の channels に single/daily などが含まれているか確認する。

原因2:storage/logs への書き込み権限不足(最頻出)

発生条件:
・本番サーバで www-data/nginx/php-fpm ユーザーが storage に書けない
・Dockerでボリュームマウントしたディレクトリの所有者が合っていない
・デプロイ後に所有者/パーミッションが変わった
対処:storage と bootstrap/cache を “実行ユーザーが書ける” 状態にする。
(環境により運用ポリシーが違うため、まずはどのユーザーでPHPが動いているかを確認し、そのユーザーに権限を合わせる)
確認・例(Linux)。

ls -la storage bootstrap/cache

典型的な修正例(環境に合わせてユーザー/グループを調整)。

chmod -R ug+rw storage bootstrap/cache
chmod -R ug+rwX storage bootstrap/cache

権限が直らない場合、ログの出力先がファイルではなく stdout/err になっている可能性もある。

原因3:ログディレクトリ/ファイルが存在しない、パスがズレている

発生条件:
・storage/logs が削除された
・シンボリックリンク/デプロイ方式でパスが変わった
・open_basedir 制限でアクセスできない
対処:
・storage/logs を作成し、書き込み権限を付与
・PHPのopen_basedirやSELinux等の制限も確認対象
(「No such file or directory」や open_basedir っぽい文言が出る場合はこの層)

原因4:設定キャッシュで古いLOG_CHANNEL/LOG_LEVELを掴んでいる

発生条件:
・.env で LOG_CHANNEL を変えた
・php artisan config:cache 済みで変更が反映されない
対処:

php artisan config:clear
php artisan cache:clear
php artisan config:cache

ログ出ない系は「直したのに変わらない」状態が多いので、キャッシュ層の排除を早めにやると短縮できる。

原因5:dailyログのローテーション/容量枯渇(ディスクフル、クォータ)

発生条件:
・dailyでログが増え続け、ディスクが満杯
・ログローテーション設定が想定より長く残る
・コンテナ/サーバのディスククォータに達する
対処:
・ディスク使用量を確認し、不要ログの削除/保持期間の調整
・logrotate等の運用を見直す
チェック例。

df -h
du -sh storage/logs
ls -lh storage/logs

dailyの保持日数は config/logging.php の channels.daily.days に影響する。

原因6:コンテナ/本番運用で “ファイルに書かない設計” になっている(stdout/err)

Kubernetes/Dockerの運用では、ログはファイルではなく標準出力に出してログ基盤で収集する構成が多い。
発生条件:
・LOG_CHANNEL=stderr / errorlog など
・storage/logs を見ても何もないが、コンテナログには出ている
対処:
・運用方針がstdoutなら、コンテナログ(docker logs / kubectl logs)を確認する
・ファイル運用に戻したいなら single/daily に変更し、ボリュームと権限を整える
例。

# stdout運用を想定(環境により名称は異なる)
LOG_CHANNEL=stderr

原因7:例外ハンドラやミドルウェアで握り潰している(reportされない)

発生条件:
・App\Exceptions\Handler の report()/render() をカスタムし、reportしない分岐がある
・try-catch で握って何もログせずに return している
・dontReport に例外クラスが入っていて抑制されている
対処:
・Handlerを確認し、例外を抑制していないか見る
・catch するなら最低限 Log::error を入れる
例。

try {
    // something
} catch (\Throwable $e) {
    Log::error('unexpected error', [
        'message' => $e->getMessage(),
        'trace' => $e->getTraceAsString(),
    ]);
    throw $e; // 可能なら再throwして監視にも乗せる
}

サンプル:ログ出力の最小動作確認(ルートで強制ログ)

「設定・権限・チャネル」が正しいかを最短で確認する。

use Illuminate\Support\Facades\Log;

Route::get('/log-test', function () {
    Log::debug('log-test debug', ['time' => now()->toDateTimeString()]);
    Log::info('log-test info');
    Log::warning('log-test warning');
    Log::error('log-test error');
    return response('ok', 200);
});

これでログが出ない場合、アプリ処理以前に“出力先/権限/設定キャッシュ”が原因の可能性が高い。

チェックリスト(上から順に確認する)

1) .env の LOG_CHANNEL / LOG_LEVEL は意図通りか(typo、存在しないチャネル名になっていないか)
2) config/logging.php の channels に出力先が定義され、stack の中身も正しいか
3) storage/logs と bootstrap/cache に書き込み権限があるか(実行ユーザーで確認)
4) config:cache を使っているなら config:clear → config:cache で反映し直したか
5) daily運用ならディスクフル/クォータ/保持期間(days)を確認したか
6) コンテナ運用なら stdout/stderr に出していないか(docker/k8sログを確認したか)
7) Handlerやtry-catchで例外を握り潰していないか(dontReport/抑制分岐がないか)