プログラムの中で必要なときにちょろっとある情報をログに残したい、しかもlaravel.logではなくカスタム(ここが大事)のログファイルを作成して残したい、というのが私の願いです。さて、どうプログラムするか?

通常は

以前にも紹介したように、カスタムのログファイルを使うには、config/logging.phpに以下のように追加して、

...
    'channels' => [
        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],
...
       'custom' => [
            'driver' => 'single',
            'path' => storage_path('logs/custom.log'),
            'level' => 'info',
            'permission' => 0666,
        ],
    ],
];

と設定して、

use Illuminate\Support\Facades\Log;
...
Log::channel('custom')->info('テストだよ');

のようにコールすると、storage/logs/custom.logが作成されて渡した文字列が日時とともに記録されます。

しかし、ログファイル名を変えたいなら、いちいちconfig/logging.phpで設定しなればならないのが難点です。

オンデマンドログ

そこで登場するのがオンデマンドのログです。以下のように使います。

use Illuminate\Support\Facades\Log;
... 
Log::build([
    'driver' => 'single',
    'path' => storage_path('logs/custom.log'),
])->info('記録したいことをここに書く');
...

Logをコールするときに、どのファイルに書き込むかなどの設定もその場で指定してしまいます。
しかし、今度はタイプする文字数が多いのが難点。

ヘルパーの作成

先の実行文をヘルパーにして、以下のようにコールするようにしたらシンプルになりますね。

custom_log('custom', '記録したいことをここに書く');
// storage/logs/customer.logに保存される
custom_log('invalid_email', '不正なメールアドレス:'.$request->email);
// storage/logs/invalid_email.logに保存される

このヘルパーの関数は、以下のように定義してapp/helpers.phpへ入れます。

<?php
use Illuminate\Support\Facades\Log;

if (! function_exists('custom_log')) {
    function custom_log($prefix, $message)
    {
        Log::build([
             'driver' => 'single',
             'path' => storage_path('logs/'.$prefix.'.log'),
        ])->info($message);
    }
}

そして、composer.jsonファイルを編集して、以下のようにautoloadにfilesとして含みます。

...
    "autoload": {
        "files": [
            "app/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
...

最後に以下を実行してローダーを更新します。

composer dump-autoload

これでLaravelのプログラムのどこでも、customer_log()を使用することができます。

By khino