Laravelでログファイルを分けたいなあ….
こんな疑問を解決します。
Laravelでは、初期状態だとログの出力はstorage/logs/laravel.logに全て表示されます。
しかし、デバッグログやエラーログなどが混在してみにくいですよね。
この記事では、ログのファイルを分けて以下のようにみやすくします。
↓↓↓
ファイルもわかりやすくするために日にちごとに振り分けていきます。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
動作確認
Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール phpmyadmin
Laravelでログファイルを分けるにはlogging.phpを変更する
Laravelでログファイルを分ける場合は、config/logging.phpを変更します。
<?php
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['debug', 'info', 'error'],
],
// デバッグログ
'debug' => [
'driver' => 'daily',
'path' => storage_path('logs/debug/debug.log'),
'level' => 'debug',
'days' => 7,
'permission' => 0664,
],
// infoログ
'info' => [
'driver' => 'daily',
'path' => storage_path('logs/info/info.log'),
'level' => 'info',
'days' => 7,
'permission' => 0664,
],
// エラーログ
'error' => [
'driver' => 'daily',
'path' => storage_path('logs/error/error.log'),
'level' => 'notice',
'days' => 7,
'permission' => 0664,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'papertrail' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];
‘channels’ => [‘debug’, ‘info’, ‘error’]と記載します。
// デバッグログ
'debug' => [
'driver' => 'daily',
'path' => storage_path('logs/debug/debug.log'),
'level' => 'debug',
'days' => 7,
'permission' => 0664,
],
ここに注目してください。
‘driver’ => ‘daily’でファイル名-2021-10-21.logのように出力します。
‘path’でパスを指定で、’laravel’はログレベルです。ログレベルには、noticeやinfo、errorやemergencyなどがあります。
そして、’days’=>7で7日間ファイルを保持することを表し、’permission’を0664にすることで、作成者によってログファイルが書き込めないことを防ぎます。
ログレベルは上に行けばいくほど緊急度が高い。
emergency
alert
critical
error
warning
notice
info
debug
ログファイルにログが出力されるか確認する
準備はできたので、それぞれのログファイルにログが出力されるか確認しましょう。
Log::info('infoにログを出力');
Log::debug('デバッグ開始');
Log::debug($date);
Log::debug('デバッグ終わり');
Log::error('errorにログを出力');
[2021-10-21 21:04:15] local.INFO: ログエラーテスト
[2021-10-21 21:04:15] local.INFO: infoにログを出力
[2021-10-21 21:04:15] local.DEBUG: デバッグ開始
[2021-10-21 21:04:15] local.DEBUG: 2021/10/30 23:59:59
[2021-10-21 21:04:15] local.DEBUG: デバッグ終わり
[2021-10-21 21:04:15] local.ERROR: errorにログを出力
[2021-10-21 21:04:15] local.ERROR: errorにログを出力
[2021-10-21 21:04:15] local.INFO: ログエラーテスト
[2021-10-21 21:04:15] local.INFO: infoにログを出力
[2021-10-21 21:04:15] local.ERROR: errorにログを出力
ログのファイルを分けられました。
ただ、Laravelでは上記のように完全には分離できないので、注意が必要です。※ログレベルによって変わるから。
さらにlogging.phpを変更してログファイルを作成する
debug,error,infoのログファイルを作成しましたが、新たにログレベルが一番高いemergencyを作成します。
まずはlogging.phpを以下のように変更します。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['debug', 'info', 'error', 'emergency'],←emergencyを追加
],
// 非常事態ログ
'emergency' => [
'driver' => 'daily',
'path' => storage_path('logs/emergency/emergency.log'),
'level' => 'emergency',
'days' => 7,
'permission' => 0664,
],
ログを出力させます。
Log::info('infoにログを出力');
Log::debug('デバッグ開始');
Log::debug($date);
Log::debug('デバッグ終わり');
Log::error('errorにログを出力');
Log::emergency('非常事態!');
すると、emergencyはログレベルが一番高いので、全てのログファイルに非常事態!とでます。
[2021-10-21 21:12:31] local.EMERGENCY: 非常事態!
[2021-10-21 21:12:31] local.INFO: ログエラーテスト
[2021-10-21 21:12:31] local.INFO: infoにログを出力
[2021-10-21 21:12:31] local.DEBUG: デバッグ開始
[2021-10-21 21:12:31] local.DEBUG: 2021/10/30 23:59:59
[2021-10-21 21:12:31] local.DEBUG: デバッグ終わり
[2021-10-21 21:12:31] local.ERROR: errorにログを出力
[2021-10-21 21:12:31] local.EMERGENCY: 非常事態!
ログファイルをカスタムして任意のログファイルを出力する
自分でログファイル名をカスタムし、任意のファイルにログを出力したい場合もあるでしょう。
できます。
試しにtestというログファイルを作成してログを出力します。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['debug', 'info', 'error', 'emergency', 'test'],←testというログファイルを追加
],
// テストログ
'test' => [
'driver' => 'daily',
'path' => storage_path('logs/test/test.log'),
'level' => 'critical',
'days' => 7,
'permission' => 0664,
],
pathを指定し、ログレベルはcriticalに設定しました。上から3番目ぐらいの緊急度です。
Log::channel('test')->critical('ログテスト');
自分でログファイルを作成する場合は、上記のようにLog::channel(‘ログファイル名’)->ログレベル(‘出力する内容’)みたいに書きます。
例えば、ログレベルがerrorなら、
Log::channel(‘ログファイル名’)->error(‘出力する内容’)
debugなら、
Log::channel(‘ログファイル名’)->debug(‘出力する内容’)
とすることで、任意のファイルにログを出力できます。
[2021-10-21 21:29:23] local.CRITICAL: ログテスト
ログの出力が確認できました。
【まとめ】Laravelでログファイルを分ける方法
今回は、Laravelでログファイルを分ける方法について解説しました。
ログファイルはカスタムできるので、開発に合わせて自由に分けてみてくださいね!
このブログでは他にも実務に役立つLaravelの記事を解説しているので合わせてチェックしてください。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント