【Laravel】ログを条件ごとに分離して保存|処理内容別にファイルを出し分ける方法

【Laravel】ログを条件ごとに分離して保存|処理内容別にファイルを出し分ける方法 Laravel

Laravelで開発を進めていくと、エラーログ・APIアクセスログ・バッチ処理ログなど、ログを用途ごとに分けて管理したくなる場面は少なくありません。特に運用フェーズに入ると、ログの粒度や保存先を制御することはトラブル対応や監視精度の向上に直結します。

この記事では、Laravelのロギング機能を活用して、処理内容に応じたログ出力の分離方法を詳しく解説します。

Laravelのログシステムの基礎とMonolog

Laravelのロギングは、内部的にMonologというPHPの高機能ログライブラリをベースにしています。Laravelでは、config/logging.phpで複数のチャンネル(出力先)を定義し、それらを用途ごとに使い分けることができます。

この仕組みを利用して、処理別にログを分けて保存する構成を実現します。

ログチャンネルの追加設定

まずは、config/logging.php に新しいログチャンネルを追加します。ここでは例として、APIアクセスログとバッチ処理ログを分離して保存する設定を紹介します。

'channels' => [

    // 既存の設定...

    'api' => [
        'driver' => 'single',
        'path' => storage_path('logs/api.log'),
        'level' => 'info',
    ],

    'batch' => [
        'driver' => 'daily',
        'path' => storage_path('logs/batch.log'),
        'level' => 'info',
        'days' => 14,
    ],

],
  • api: 単一ファイルに保存されるAPIアクセスログ
  • batch: バッチ処理用のログ。日付別で最大14日間保存

このように、用途ごとにチャンネルを設けることでログを分離できます。

処理ごとにログを出力する

ログ出力にはLogファサード、もしくはlogger()ヘルパーを使用します。チャンネルを明示するにはLog::channel()を使います。

use Illuminate\Support\Facades\Log;

Log::channel('api')->info('API accessed', ['endpoint' => '/api/user']);
Log::channel('batch')->warning('Batch job started', ['job' => 'ExportCsvJob']);

このように処理の種類に応じてログを振り分けることで、ログファイルの内容が整理され、運用効率が向上します。

コンテキストごとのログ出力をサービスクラスで統一する

ログ出力が散らばるのを防ぐため、専用のロガークラスを用意するのも有効です。

namespace App\Services;

use Illuminate\Support\Facades\Log;

class CustomLoggerService
{
    public function api($message, array $context = [])
    {
        Log::channel('api')->info($message, $context);
    }

    public function batch($message, array $context = [])
    {
        Log::channel('batch')->info($message, $context);
    }
}

コントローラーやジョブからは以下のように呼び出します。

app(\App\Services\CustomLoggerService::class)->api('ユーザー取得APIが呼び出されました。');

カスタム条件でログチャンネルを切り替える応用例

ログ出力の条件を動的に制御したい場合は、Log::stack()や条件分岐を用いて処理を分けることも可能です。

if (app()->runningInConsole()) {
    Log::channel('batch')->info('CLIからの処理');
} else {
    Log::channel('api')->info('Web経由の処理');
}

このようにして、実行環境に応じたログの出し分けも実現できます。

ログの可視化・集約のヒント

Laravelでは、ログファイルをローカルに保存するだけでなく、外部サービス(Slack、Papertrail、CloudWatchなど)に送信する設定も可能です。これらと組み合わせれば、複数のログチャンネルのモニタリングや通知連携も行えます。

まとめ

Laravelのログ機能は非常に柔軟で、チャンネルごとに出力先・形式・保存日数などを詳細に設定可能です。処理ごとにログを分離することで、保守性や障害対応力が格段に向上します。

開発初期からログ設計に意識を向けておくことで、トラブル時の調査や性能分析に強いアプリケーションが構築できます。Laravelのロギングシステムをぜひ積極的に活用してみてください。