概要
Laravelのログのフォーマット(tsv形式)を変更し、フィールドの1つとしてセッションが管理している値を出します。
出力対象は下記とします。
- 実行中のクラス名
- ログ出力した行番号
- メソッド名
- セッションに格納された情報を表示(メッセージとしてではなくフィールドの1つとして)
環境
>php --version
PHP 7.2.12 (cli) (built: Nov 8 2018 05:47:24) ( NTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans
>php artisan --version
Laravel Framework 5.7.15
実装
ログのフォーマットを定義するクラスを作成する。
カスタマイズの内容を記載したカスタム実装を用意する。
<?php
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Processor\IntrospectionProcessor;
class CustomizeFormatter
{
private $logFormat = "";
private $dateFormat = 'Y/m/d-H:i:s.v';
public function __construct()
{
// ログ出力するカラムを設定
$cols = [
"%datetime%",
"%level_name%",
"session_value:%extra.session_value%", // セッション情報出力用のフィールド
"%extra.class%::%extra.function%#%extra.line%", // クラス名::メソッド名#行
"%message%",
"%context%",
];
// タブ区切りでフォーマットを生成
$this->logFormat = implode("\t", $cols) . PHP_EOL;
}
/**
* 渡されたロガーインスタンスのカスタマイズ
*
* @param $monolog
* @return void
*/
public function __invoke($monolog)
{
// フォーマットを指定
$formatter = new LineFormatter($this->logFormat, $this->dateFormat, true, true);
// extraフィールドの追加
$ip = new IntrospectionProcessor(Logger::DEBUG, ['Illuminate\\']);
foreach ($monolog->getHandlers() as $handler) {
$handler->setFormatter($formatter);
$handler->pushProcessor($ip);
// extraフィールドにログ出力対象となるセッション情報を設定する
$handler->pushProcessor(function ($record) {
// 対象となるセッションキー設定
$cols = ["session_value"];
foreach ($cols as $col) {
if (session()->has($col)) {
$record['extra'][$col] = session()->get($col);
}
}
return $record;
});
}
}
}
logging.phpにカスタムフォーマットを設定する。
チャンネルの設定にtap
を追加し、カスタマイズしたログのクラスを指定すると該当のカスタム実装が適用される。
logging.php
'daily' => [
'driver' => 'daily',
'tap' => [App\Logging\CustomizeFormatter::class], // ここを追加する
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
実行
session->put("session_value", 1234)
を実行し、Log::info()
すると、session_valueのフィールドが追加され、1234が出力されていることが分かる。
ログ出力にinfo()
を使うとログフィールドのクラス名::メソッド名#行
部分が常にinfo()になってしまうので注意