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('日次データ作成処理を開始しました');
できました!
でました!
[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')));
わけたらわけたで全体を時系列で追っかけるのが難しくなる場合があるため、難しいですがいろいろ考えて設計しましょう。
以上