Laravelのログ設定を徹底的に理解する
Laravelで構築したアプリケーションを安定的に運用していくためにはログの設定を十分に理解しておく必要があります。本文書ではデフォルト設定を変更し、ログの動作確認を行うことでLaravelのロギングの理解を深めていきます。
Laravelはログ管理にmonologパッケージを利用しています。monologの理解はLaravelのログを使いこなす上で重要なのでmonologに触れたことがない人は下記の文書を読んでおくことをおすすめします。決して難しいものではありません。
目次
デフォルトのログ設定の確認
デフォルトでのログ設定の確認を行います。ログの設定はconfigのlogging.phpの中に記述されています。
'default' => env('LOG_CHANNEL', 'stack'),
.envファイルのLOG_CHANNELの設定がなければdefaultはstackに設定されます。
.envファイルを確認するとLOG_CHANNELの設定がstackになっているので、デフォルト値はstackとなります。
LOG_CHANNEL=stack
設定値stackとは
stack以外にsingleチャネルやdailyチャネル、slackチャネルというものをlogging.phpの中で確認することができます。stackを理解する前に他のチャネルがどのようなものか説明を行いその後にstackについて説明を行います。
- singleはlaravel.logファイルのみにログメッセージを書き込むチャネルです。ファイルはstorage/logs/の下にあります。
- dailyもsingleと同様にファイルにログメッセージを書き込むのですが、singleとは異なりlaravel-2019-08-08.logのような日付のついたファイルになります。ファイルはstorage/logs/の下にあります。
- slackは名前の通り、slackのアプリケーションにログメッセージを送信する際に使うチャネルです。
- syslogはローカルのsyslodサービスを利用してログを出力します。syslog関数が中で実行されています。
- errorlogはPHPのerror_log関数が実行され、環境に応じて出力される場所はかわりますがerror_logファイルに出力されます。
上記のようにチャネルによってログメッセージを処理する方法が異なります。stackはsingle, daily, slackチャネルとは異なり、それ自身が何かにログを書き込んだりどこかに送信するわけではなくどのチャネルを使ってログメッセージを処理するのか設定することができるチャネルです。またstackを使うことで複数のチャネルを同時に使用してログの処理を行うことができます。
例えばlogging.phpのchannelsを確認してみましょう。
stackチャネルにchannelsという設定箇所があり、配列にdailyが設定されています。デフォルトではdailyチャネルを使うことを意味しています。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'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',
],
もし、dailyチャネル以外にもslackチャネルを使ってログメッセージを送信したい場合は、以下のようにchannelsを設定することができます。stackによって複数のチャネル(dailyとslack)を同時に使用することができます。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily','slack'],
'ignore_exceptions' => false,
],
ログの動作確認
dailyチャネルでのログの書き込み
デフォルトではstackを通してdailyチャネルが使われることがわかりました。実際に意図的にログの書き込みを行って書き込まれる内容を確認してみましょう。
web.phpファイルを開いてヘルパー関数loggerを使ってinfoレベルでメッセージをログに書き込みます。
Route::get('/', function () {
logger()->info('Something happends');
return view('welcome');
});
logger関数ではなくLogファサードも使用することができます。
Route::get('/', function () {
\Log::info('Something happends');
return view('welcome');
});
storage/logs/の下にある日付の入ったlaravel-2019-08-08.logファイルに下記のログが書き込まれます。
[2019-08-08 12:42:51] local.INFO: Something happends
singleチャネルでのログの書き込み
singleチャネルを使うためにデフォルトのstackからsingleに変更を行ってもログの書き込みが正常に行われるのか確認してみましょう。
.envファイルを開いてLOG_CHANNELをstackからsingleに変更します。
LOG_CHANNEL=single
設定をstackからsingleに変更してアクセスを行うとstorage/logsの下に新たにlaravel.logが作成され、その中にログメッセージが記述されることが確認できました。
slackチャネルでのログ送信
slackを利用する企業は日に日に増えています。今後slackチャネルを使用した場合の手順をここに記述する予定です。
チャネルを指定してログを書き込む
デフォルトのチャネルを使用する場合はLogファサードを使用してログを書き出す際に何も設定する必要がありませんが、デフォルト以外のチャネルを使用する場合は、channelメソッドが必要にあります。singleチャネルを使ってログを書き出したい場合は以下のように記述します。
Log::channel('single')->error('Something happends');
ログレベル
ログレベルについて
ロゴに書き込まれるメッセージの重要度によってログは下記の8つのレベルに分けられています。
emergency, alert, critical, error, warning, notice, info, debug
emergencyが最も重要度の高いレベルで、右にいくほど重要度は下がっていきます。
ログに書き込む際はレベルを指定して書き込むことができます。ヘルパー関数を利用した場合はとLOGファサードを利用した場合の記述方法は下記のとおりです。
【Logファサードを利用した場合】
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
【logger()関数を利用した場合】
logger()->emergency($message)
logger()->alert($message)
logger()->critical($message)
logger()->error($message)
logger()->warning($message)
logger()->notice($message)
logger()->info($message)
logger()->debug($message)
ログレベルとチャネルとの関係
logging.phpファイルの各チャネルの設定を確認するとlevelオプションを確認することができます。singleチャネルの場合はlevelはdebugに設定されています。
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
levelでは設定したログレベル以上のメッセージをログに書き込むことを意味します。level=debugに設定するということはdebugが一番下のログレベルなのですべてのログを書き込むことを意味します。
一時的にsingleチャネルのレベルをcriticalに設定して動作確認を行ってみましょう。
criticalレベルでログを書き込むとLaravel.logファイルに書き込みがありましたが、errorやwarningレベルに変更すると書き込みはありません。
logger()->critical('Something happends');
[2019-08-08 13:24:43] local.CRITICAL: Something happends
[2019-08-08 13:26:37] local.EMERGENCY: Something happends
slackチャネルなどを使う場合は、debugレベルにしてしまうとすごい数のメッセージを受信することになるので適切なログレベルの設定を行う必要があります。