ハマログ

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

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   kaneko tomo   2016年10月5日


関連記事

MACとWindows環境の濁点問題

どうも!宇都宮です! 今回は業務中におきた問題について備忘録も兼ねて更新したいと…

yumのリポジトリで悩む

こんばんは、いけしまです。ものすごくごぶさたのブログ更新となってしまいました。 …

LaravelのEloquent,Query Builderで値をランダムソートする

検証環境 PHP5.6 Laravel5.3 Laravel5.2からEloqu…


← 前の投稿

次の投稿 →