E130 ログの設定

ログを設定することで、エラーの原因を究明しやすくなり、安定した運用を行う上では必須となってきます。今回はログの設定方法について紹介します。

ログファイルの設定方法

いつ出力されたログかわかりやすくするため、1ログファイルのサイズを抑えるためにログファイルを日ごとで切り替えるように設定をします。

①ログの設定は.env で指定されているため、.envファイルに追記を行う。

※下記、L7~L9を参照

.env
+ LOG_CHANNEL=stack
+ LOG_DEPRECATIONS_CHANNEL=null
+ LOG_LEVEL=debug

設定されている値の定義は config/logging.php で定義されています。LOG_CHANNEL=stack の定義は下記でされております。

config/logging.php
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
            'ignore_exceptions' => false,
        ],

②日時でローテーションにするため、下記の様に修正する。

※下記、L69~L70を参照

config/logging.php
  'daily' => [
              'driver' => 'daily',
              'path' => storage_path('logs/laravel.log'),
-             'level' => 'debug',
+             'level' => env('LOG_LEVEL', 'debug'),
              'days' => 14,
          ],

③.envのLOG_CHANNNELをstack から dailyに変更する。

※下記、L7~L8を参照

.env
- LOG_CHANNEL=stack
+ LOG_CHANNEL=daily

④app/Logging/CustomizeLogger.php を新規作成する。

app/Logging/CustomizeLogger.php
<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeLogger
{
    /**
     * 指定するロガーインスタンスをカスタマイズ
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->pushProcessor(function ($record) {
                array_walk_recursive($record, function (&$val, $key) {

                    // ログコンテキストに個人情報が含まれる場合、値をマスクする
                    // ログ出力時にコンテキストを配列で渡した場合
                    // コンテキストにModel Objectを渡した場合はModelのhiddenパラメータで対処可能
                    if (($key === 'password')||($key === 'password_confirmation')||($key === 'email')) {
                        $val = '********';
                    }
                });
                return $record;
            });
        }
    }
}

⑤config/logging.php の channel.daily の設定で、作成したカスタムロガーを利用するように設定します。

※下記、L70を参照

config/logging.php
 'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
+           'tap' => [App\Logging\CustomizeLogger::class],
            'days' => 14,
            ],

確認事項

・ログが出力される処理を実施して、storage/logs/laravel-yyyy-MM-dd.log 形式で実施日のログが出力されていることかを確認する。

・emailがログに出力されるようログ出力処理を実装して、ログのemail出力がマスクされているかを確認する。

---