Copy & Paste Engineer

【Laravel】ログをJSON化する方法

【Laravel】ログをJSON化する方法

ログをJSON化する方法

サンプルコード

確認環境

補足

PHP 8.0.1 Laravel 8.73.2

JSONフォーマットクラスを作成

ログのフォーマットを変更するクラスを作成します。

<?php

declare(strict_types=1);

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class JsonLogFormatter extends LineFormatter
{
    public function format(array $record):string
    {
        return json_encode(parent::format($record));
    }
}

ログ適用クラスを作成

ログのフォーマットを適用させるクラスを作成します。

<?php

declare(strict_types=1);

namespace App\Logging;

use App\Logging\JsonLogFormatter;

class JsonLogApply
{
    public function __invoke($logging)
    {
        $jsonFormatter = new JsonLogFormatter();

        foreach($logging->getHandlers() as $handler) {
            $handler->setFormatter($jsonFormatter);
        }
    }
}

ログを追加

logging.php にログを追加。

<?php

return [

        // この行を追加
        'json' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
            'tap' => [App\Logging\JsonLogApply::class],
        ],
]

設定を変更

.env の設定を変更

LOG_CHANNEL=custom

ログを仕込む

Welcomeページに仕込みました。

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;

Route::get('/', function () {
    Log::debug('test');
    return view('welcome');
});

出力結果

JSONになって出力されるようになりました。

{"message":"test","context":[],"level":100,"level_name":"DEBUG","channel":"local","datetime":"2021-12-01T03:52:01.518468+00:00"}}

参考