WEB工房しずおかのロゴ

WEB工房しずおか

Laravelでログ出力を「日付ごと」「Web/バッチ」で分割・自動切り替えする方法

Laravel
Koshio

Laravel ログ設定解説

みなさん、こんにちは!WEB工房しずおかの開発チームです。

弊社ではLaravelを使ったWebアプリケーションの開発や保守を日々行っていますが、運用フェーズに入ると重要になるのがログ(Log)の管理です。

今回は、Laravel標準のログ出力機能を使って、ログファイルを「日付ごと」かつ「通常操作(Web)」と「バッチ処理(CLI)」で分けて出力し、自動で切り替える方法について分かりやすく解説します!


1. なぜWeb用とバッチ用でログを分ける必要があるのか?

Laravelのデフォルト設定では、すべてのログが storage/logs/laravel.log という1つのファイルに書き込まれます。 これでも開発環境では問題ないのですが、本番環境で以下のような運用をするとパーミッションエラーが発生しやすくなります。

  • Webアクセス: Webサーバー(NginxやApacheなど)のユーザー権限でログに書き込む
  • バッチ処理: クーロン(cron)などを実行するOSユーザー権限でログに書き込む

この2つの異なる権限を持つユーザーが同じ laravel.log に書き込もうとすると、「Permission denied」となってシステムが停止する原因になります。これを防ぐためのベストプラクティスが、用途ごとにログファイルを物理的に分けることです。


2. ログチャンネルの定義(config/logging.php)

まずは、用途に応じたログの出力先(チャンネル)を作成します。 「日付ごと」にファイルを分割するため、Laravel標準の daily ドライバーを使用します。

config/logging.php を開き、channels 配列の中に web と batch を追加してください。

// config/logging.php

'channels' => [
    // ... 既存の設定

    // 通常操作(Web)用
    'web' => [
        'driver' => 'daily',
        'path' => storage_path('logs/web.log'),
        'level' => env('LOG_LEVEL', 'debug'),
        'days' => 14, // 保持する日数(14日間)
        'permission' => 0664,
    ],

    // バッチ処理(Artisan / クーロン等)用
    'batch' => [
        'driver' => 'daily',
        'path' => storage_path('logs/batch.log'),
        'level' => env('LOG_LEVEL', 'debug'),
        'days' => 14,
        'permission' => 0664,
    ],
],

この設定により、web-2026-10-03.log や batch-2026-10-03.log のように、自動的に日付が付与されたログファイルが生成されるようになります。


3. 実行環境に応じた自動切り替え設定(AppServiceProvider)

チャンネルの準備ができたら、システムが「今Webから実行されているか」「バッチから実行されているか」を自動で判定し、デフォルトのログ出力先を切り替えるように設定します。

開発者がコードを書く際に、いちいちチャンネルを指定する手間が省けるため非常に便利です。

app/Providers/AppServiceProvider.php を開き、boot メソッド内に以下のコードを追記します。

// app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Log;

public function boot()
{
    // コマンドライン(バッチ、キュー、スケジューラ)からの実行か判定
    if (app()->runningInConsole()) {
        // バッチ処理の場合は 'batch' チャンネルをデフォルトにする
        config(['logging.default' => 'batch']);
    } else {
        // Webアクセスの場合は 'web' チャンネルをデフォルトにする
        config(['logging.default' => 'web']);
    }
}

これで設定は完了です! あとはコントローラーやコマンドの処理内で、普段通り Log::info('メッセージ'); と書くだけで、実行環境に応じたファイルにログが自動で振り分けられます。


まとめ:ログの分割で安定したシステム運用を

今回は、Laravelのログ出力を日付・用途(Web/バッチ)ごとに分割し、自動で切り替える設定手順を解説しました。

  • dailyドライバーを活用して日別のログファイルを作成する
  • ログファイルを分けることで、パーミッションエラーを未然に防ぐ
  • AppServiceProvider で実行環境を判定し、意識せずにログを出力させる

これらの設定をしておくことで、運用中のトラブル対応がスムーズになり、システムの安定性も向上します。ぜひプロジェクトに導入してみてください。

WEB工房しずおかでは、社内インフラの整備からWebアプリケーションの開発・保守までトータルでサポートしております。開発環境のトラブルやシステム構築でお困りの際は、ぜひお気軽にお問い合わせください!