Laravelのログ設定 (Monolog)

アプリケーション開発で必要なのがログの設定です。ログの設定はあらかじめ用意されているMonologを使うのがよいです。
Monolog自体は(たぶん)独立したパッケージの筈。
https://packagist.org/packages/monolog/monolog
ここからダウンロードするとか、Githubで入手するとか、Composerでいい感じにしておくとかいろいろできます。

標準のログ

Larabelの標準のログもMonologでやっているようです。
Laravel 5.4 エラーとログ
細かいこと抜きにするとやり方は結構簡単です。
monologをuseして、

// Monolog
use Illuminate\Support\Facades\Log;

ログの取りたいメソッド内で、

Log::info('なんらかのメッセージとか。 ID:'.$user);

みたいに、引っ張ってこれている値とかをつけてメッセージと共に書いておくだけです。この場合、Laravelの標準のログ(storage/logs/laravel.log)に追記される感じです。
メッセージには、

  • debug
  • info
  • notice
  • warning
  • error
  • critical
  • alert
  • emergency

というレベルがあって環境設定でもってログレベルを設定するとそれ以上のレベルのログが吐かれる仕組みになっています。つまりdebugにしておくと全部、プロダクトの運用環境などではalertぐらいにしておいてalertとemergencyを…みたいな感じです。Laravelのデフォルトのログレベルは、

// config/app.php
'log' => env('APP_LOG', 'single'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),

となってます。ここはお好みですが、dailyとdebugぐらいにしておくのが私は好きです。

ログのカスタマイズ

まずはLaravelの標準ログとは別ファイルに独自に書き込むということにしてみましょう。正直Linuxサーバーで使うことが多いのでLinuxのログローテートに任しておけばいいということもあるので、システムログとして独自のアプリケーションは別立てでログを作っておくのがよいです。
Laravelのログはmonologのラッパーになっているっぽいので、独自のファイルで(あるいは複数のログファイルを管理する)場合にはMonologを根っこから呼んで新規でインスタンス作って独自に設定してあげるってのがよいです。(となると、本来的には独自カスタムログのトレイト作っておくのがよかろうということになるかと。)

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

...

/**
* Monologのカスタムログ(ログイン認証のロギング)
*
* @var string
*/
protected $custom_log;

...

public function __construct() {
    $this->custom_log = new Logger('test');
    $this->custom_log->pushHandler(new StreamHandler("/foo/bar/storage/logs/custom.log", Logger::INFO));
}

...

public function foo() {

    // ログの取りたいところで。
    $this->custom_log->addDebug('debug_bar');
    $this->custom_log->addInfo('info_bar');
    $this->custom_log->addNotice('notice_bar');
    $this->custom_log->addWarning('warning_bar');
    $this->custom_log->addError('error_bar');
    $this->custom_log->addCritical('critical_bar');
    $this->custom_log->addAlert('alert_bar');
    $this->custom_log->addEmergency('emergency_bar');
}

みればわかるのだけど、ざっくり解説すると、LaravelはAutoloaderで動いているので使いたいクラスでuseしてあげればOKというわけでMonologを呼び出してます。上記のように2つuseしておけばよしです。
それから一応礼儀として$custom_logというプロパティーを作ってあげる。このプロパティーでオブジェクトを受けてあげればよいという感じです。で、コンストラクタでnewしてHandlerを設定。ここで出力先のファイルパスとファイル名、ログレベルなんかを設定してあげます。
最後にログの取得したい場所でaddDebugとかaddXXXXでもってメッセージを書込みます。
しかしシェルのリダイレクト>>でログ取ってた時代と比べると非常にシンプル且つ簡単でいいですね。


http://yonishiy.hatenablog.com/entry/2016/07/03/185402

Last update: 2017.10.01 (日)