ハマログ

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

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日


関連記事

GCPのプロジェクトを削除できない(プロジェクトには、誤って削除されるのを防ぐために 1 つ以上リーエンが含まれています)

年末なのでGCPのプロジェクトを整理しました。無制限に作成できる状態にしていたの…

OPTIMIZE TABLE / MySQL

OPTIMIZE TABLEは次のような機能です [引用元] 12.5.2.5….

AWS CDKで作った定期的なタスク起動がたまに失敗するのでStep Functionsを導入したお話

昔々あるところに、毎日起動しているはずのAmazon ECSのタスクが起動しなか…


← 前の投稿

次の投稿 →