ハマログ

株式会社イーツー・インフォの社員ブログ

Laravelのログファイル分割

Laravelのログは、デフォルトでstorage/logs/laravel.logに出力されます。
コマンドの実行ログもウェブアプリの実行ログもすべて同じファイルに出力されます。

config/app.phpの以下の設定で、日付単位の出力や出力ログレベルの指定ができます。

// ログ種別。単一(single)、日別(daily)、システムログ(syslog)、エラーログ(errorlog)
'log' => env('APP_LOG', 'daily'),
// dailyの場合、ログを保有する日数
'log_max_files' => '90',
// ログレベル
'log_level' => env('LOG_LEVEL', 'info'),

今回、コマンドのログを別のファイルに出力したかったのですが、フレームワークが標準で対応していないためやりかたを考えました。

まず、コマンドのデフォルトコンストラクタにLog::useFilesを書いてみました。
が、複数のコマンドで記載したところ、意図したファイルとは別の箇所にログが出力されるという結果に。

public function __construct()
{
    parent::__construct();
    Log::useFiles(storage_path() . '/logs/console/command_signature_here.log');
}

Http/Kernel.phpとConsole/Kernel.phpのbootstrappersにIlluminate\Foundation\Bootstrap\ConfigureLoggingの呼び出しがあり、共通のインスタンスが利用されているようです。
つまり、Log::useFilesを呼び出した後は、アプリケーション内すべてのログが指定したファイルに出力されるようになってしまいます。

ということで、標準関数で対応するのをやめて、Monologで書きました。LaravelのログはMonologのラッパーなので、ライブラリをインストールをしなくてもそのまま利用することができます。

まず、useします

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

続いてインスタンス変数を作って

protected $log;

コンストラクタに初期化コードを記載

public function __construct()
{
    parent::__construct();

    $this->log = new Logger($this->signature);
    $this->log->pushHandler(new StreamHandler(storage_path() . '/logs/console/command_signature_here.log', config('app.log_level')));
}

ログを出力します。

$this->log->addInfo('日次データ作成処理を開始しました');

できました!

20161005-165912

でました!

[2016-10-05 16:58:57] command:name INFO: 日次データ作成処理を開始しました [] []

Laravel側でログを日別にする場合は、RotatingFileHandlerを利用します。

use Monolog\Handler\RotatingFileHandler;

// (略)

$this->log->pushHandler(new RotatingFileHandler(storage_path() . '/logs/console/command_signature_here.log', config('app.log_max_files'), config('app.log_level')));

わけたらわけたで全体を時系列で追っかけるのが難しくなる場合があるため、難しいですがいろいろ考えて設計しましょう。

以上

LaravellogMonologPHPログローテーション分割

  kaneko tomo   2016年10月5日


関連記事

Laravelのマイグレーション(Migrations)

こんにちは、かねこです。 はじめに Laravelでのデータベースマイグレーショ…

特定の文字列を検索したいときあるじゃん?

コマンド覚えてないんですよね。 ってことで、コマンドラインで作業する際に、「あ、…

Python3でBasic認証の必要なURLにアクセスする

Pythonでコードを書く機会がありまして、(途中で挫折しましたが)お手軽でなか…


← 前の投稿

次の投稿 →