LoginSignup
1
2

More than 5 years have passed since last update.

Laravelのログのフォーマットをカスタマイズし、フィールドの1つとしてセッションが管理している値を出す

Last updated at Posted at 2019-02-16

概要

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()になってしまうので注意

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2