laravel.log に何でもいれるな
原則として laravel.log はエラーログだけにしたい。エラーが発生しないなら常に空っぽの状態というのが心休まる。
開発時に Debug ログの出力を仕込んだなら、コミットするときに削除(せめてコメントアウト)してもらいたい。
デバックが必要な事態が起きたときに Debug ログを仕込んで laravel.log を監視しても、全然関係ないデバッグ情報が延々と流れてきては辟易する。
定期実行タスクの実行ログや特定機能のデバッグログは、それぞれの機能や目的に応じてログファイル名を変えて保存したい。……ということで、ログファイル名を指定できるカスタムヘルパー logger_to を作ってみた。
カスタムヘルパーを作成
標準のロギングチャンネル single をベースに使用して名前だけを変更する。
なお sigle をベースにするのは、ローテションは logrotate でおこなうべきで、Laravel 側で日付毎ログにするのは余計なお世話だから。
app/Helpers/custom.php
use Illuminate\Support\Facades\Log;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
if (!function_exists('logger_to')) {
/**
* Undocumented function
*
* @param string $fileName : 区切りでlevel(デフォルトdebug)を指定可
* @param string $message
* @param array $context
* @param array $extra
* @return void
*/
function logger_to(string $fileName, string $message, array $context = [], array $extra = []): void
{
list ($fileName, $lavel) = explode(':', $fileName);
$level = $level ?: 'debug';
// ファイル名に拡張子があれば削除して .log に置換
$fileName = preg_replace(['/\..+$/', '/$/'], ['', '.log'], $fileName);
$log = new Logger('single');
$log->pushHandler(new StreamHandler(storage_path('logs/' . $fileName), Logger::toMonologLevel($level)));
$log->{$level}($message, $context, $extra);
}}
オートロード設定
composer.json に追加
// composer.json
"autoload": {
"psr-4": {
"App\\": "app/"
},
"files": [
"app/Helpers/custom.php"
]
}
オートロードのリフレッシュ
composer dump-autoload
使用例
- mydebug.logに変数$userの配列をDEBUGg出力
logger_to('mydebug', 'user', $user->toArray())
- mytask.logにタスクの開始をINOF出力
logger_to('mytask:info', 'start task command');