ノーバグノーライフ

細々と記事書いていきます!!

Laravelでログのフォーマット変更する方法

Laravel5.7でログのフォーマットを更新する必要があったため、
実施した内容を記載しておきます。

ログの設定ファイルを変更する

ログのチャンネルの設定でtap配列を定義する。

config/logging.php

<?php
    'channels' => [
    // ~
        'single' => [
            'driver' => 'single',
            'tap' => [App\Logging\CustomizeFormatter::class],
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
    // ~
    ]

tap 配列にはMonologインスタンスをカスタマイズするクラスを入れてください。

ログのフォーマットのカスタマイズ処理を書いていく

設定ファイルで指定したファイルを作成して、編集を行ってください。

app\Logging\CustomizeFormatter.php

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Processor\IntrospectionProcessor;
use Monolog\Processor\WebProcessor;
use Monolog\Processor\ProcessIdProcessor;

class CustomizeFormatter
{

    /**
     * ログのフォーマット
     * @var string
     */
    private $logFormat = '[%datetime% %channel%.%level_name% ip:%extra.ip% pid:%extra.process_id% %extra.class%::%extra.function%(%extra.line%)] %message% %context%' . PHP_EOL;

    /**
     * 日付のフォーマット
     * @var string
     */
    private $dateFormat = 'Y/m/d H:i:s.v';

    /**
     * 渡されたロガーインスタンスのカスタマイズ
     * 
     * @param \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($monolog)
    {
        // フォーマットを指定
        $formatter = new LineFormatter($this->logFormat, $this->dateFormat, true, true);

        // extraフィールドの追加
        $ip = new IntrospectionProcessor(Logger::DEBUG, ['Illuminate\\']);

        // ip等の情報追加
        $wp = new WebProcessor();

        // プロセスIDの追加
        $pid = new ProcessIdProcessor();

        foreach ($monolog->getHandlers() as $handler) {
            $handler->setFormatter($formatter);
            $handler->pushProcessor($ip);
            $handler->pushProcessor($wp);
            $handler->pushProcessor($pid);
        }
    }
}

今回アクセス元IPとプロセスIDを追加したかったので、
WebProcessorとProcessIdProcessorを追加しました。
IntrospectionProcessorはログが出力されたファイルを入れたかったので追加しました。

フォーマットが変更されているか動作確認

今回は動作確認程度なので、
ルーティングでログを出すようにして、出力を確認します。

/routes/web.php

<?php
Route::get('/', function () {
    Log::info('test');
    return view('welcome');
});

トップ画面を表示して以下のようなログが出てれば完了です。

[2018/12/02 14:38:10.002 local.INFO ip:172.31.0.1 pid:7 Fideloper\Proxy\TrustProxies::handle(57)] test

他にも情報をログに追加したい場合

ログのフォーマットに入れることができるものは他にも提供されいています。

以下のディレクトリにプロセッサーが入っているので、確認してみてください。

vendor/monolog/monolog/src/Monolog/Processor/