Laravelで構築したアプリケーションを安定的に運用していくためにはログの設定を十分に理解しておく必要があります。本文書ではデフォルト設定を変更し、ログの動作確認を行うことでLaravelのロギングの理解を深めていきます。

Laravelはログ管理にmonologパッケージを利用しています。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のアプリケーションにログメッセージを送信する際に使うチャネルです。

このように通常はチャネルによってログメッセージを処理する方法が異なります。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を設定することができます。dailyとslackチャネルを同時に使用することができます。


'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily','slack'],
        'ignore_exceptions' => false,
    ],

ログの動作確認

dailyチャネルでのログの書き込み

デフォルトではstackを通してdailyチャネルが使われることがわかりました。実際に意図的にログの書き込みを行って書き込まれる内容を確認してみましょう。

web.phpファイルを開いてヘルパー関数loggerを使ってinfoレベルでメッセージをログに書き込みます。

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
dailyチャネルではdaysオプションで15が設定されています。14日分のログが保存されることを意味しています。0を設定するとログが削除されることはありません。またファイル名のフォーマとはlaravel-YYYY-MM-DD.logです。

singleチャネルでのログの書き込み

singleチャネルを使うためにデフォルトのstackからsingleに変更を行ってもログの書き込みが正常に行われるのか確認してみましょう。

.envファイルを開いてLOG_CHANNELをstackからsingleに変更します。


LOG_CHANNEL=single

設定をstackからsingleに変更してアクセスを行うとstorage/logsの下に新たにlaravel.logが作成され、その中にログメッセージが記述されることが確認できました。

laravel.logファイルを削除しても再度ログが書き込まれるイベントが発生すると自動でlaravel.logファイルは作成されます。

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);

Logファサードを使用する場合はuse Illuminate\Support\Facades\Log;が必要になります。

【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レベルにしてしまうとすごい数のメッセージを受信することになるので適切なログレベルの設定を行う必要があります。