【Laravel】monologでカスタムログ出力先を変更する方法メモ
2018-11-05ログの出力設定
調査に時間を掛けてしまったのでメモです。
Laravelのログは全て同じファイル(storage/logs/laravel.log)に出力される。
ログを単一で出力するか、日毎に分けて出力するかはconfig/app.phpで設定することができる。
■config/app.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
・ ・ // ログを単一で出力する場合は(single)を指定 'log' => env('APP_LOG', 'single'), // ログを日別で出力する場合は(daily)を指定 'log' => env('APP_LOG', 'daily'), // デフォルトは、5日分でログローテが走るが、90日分出力したい場合は以下のように指定 'log_max_files' => '90', ・ ・ |
ログの出力先を変更したい時
本番環境のデバッグの為、標準で出力するログとは別に、特定の機能に対してログを仕込みたい場合があります。
その場合、別ファイルにログを出力するほうが調査がはかどりやすいので、今回はLaravel標準でも使用している「Monolog」を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
・ ・ // 使いたい場所(コントローラーとか)で、useする。 use Monolog\Logger; use Monolog\Handler\StreamHandler; //★単一のログファイルを出力したい場合 use Monolog\Handler\ RotatingFileHandler; //★日付でログファイルをローテートしたい場合 ・ ・ // ログイン処理にログを仕込みたい想定 class AuthController extends Controller { // ロガー $log = new Logger('name'); // ログ名を引数にいれます。(ログが出力された時、) // ハンドラー(メイン処理)に入れる引数を用意する。 $log_path = storage_path() .'/logs/login.log'; //ファイルパス $log_level = config('app.log_level'); // ログレベル $bubble = true; // 以降のハンドラに処理を続行させるかどうかのフラグ、デフォルトは、true $filePermission = 0777; //ログファイルのパーミッションを変更できるので、必要な場合は入れておく // ★ロガーにハンドラーをpush $log->pushHandler(new StreamHandler($log_path, $log_level , $bubble, $filePermission)); // ログを出力 $this->log->addInfo('ココに出力するログ内容を書きます。'); |
これで、「/storage/logs/login.log」にログが表示されます!
★今回はハンドラーをStreamHandlerにしましたが、日別でログローテしたい場合は、2番めの引数に何日分のログを取るのか入れて、RotatingFileHandlerを使用してください。
1 |
new RotatingFileHandler($log_path, $maxFiles = 0, $log_level , $bubble, $filePermission) |
以下のようにファイルが出力されるはずです。
その他
今回は一部分しか使ってないですが、色んな所で、ログを取りたい場合は、トレイト化した方が良いかも。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
protected $log; protected $bubble; protected $filePermission; protected $bubble; protected $filePermission; ・ ・ public function __construct() { parent::__construct(); $this->log = new Logger($this->signature); $this->log_path = storage_path() .'/logs/login.log'; $this->log_level = config('app.log_level'); $this->bubble = true; $this->filePermission = 0777; $this->log->pushHandler(new StreamHandler($log_path, $log_level , $bubble, $filePermission)); } ・ ・ // ログ出力を処理をメソッドに用意しておく $this->log->addInfo('◯◯処理を開始しました'); |
あと、基本singleか、dailyしか設定が無いので、1週間単位でログを出力したかったりする場合、StreamHandlerを使って、ログローテーションを自作するしか無い気がします。
例えばFileファザード使って、対象のログファイルの一覧をとって、最終更新のファイルが1週間以上前のログで、5つ以上ファイルがあったら一番古いログを削除して本日日付名で新規ファイル作成するとか。
(方法あったら、ご教授くださいm(_ _)m )
————————————-
この記事がお役に立てたら、是非シェアをお願いします^^