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',
    ],
stack, singleなどのチャネルが同じ階層で設定されているのでstackは単独の機能のような気がしますがstackは他のチャネルとは異なり、他のチャネルを利用するチャネルです。
fukidashi

もし、dailyチャネル以外にもslackチャネルを使ってログメッセージを送信したい場合は、以下のようにchannelsを設定することができます。stackによって複数のチャネル(dailyとslack)を同時に使用することができます。


'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily','slack'],
        'ignore_exceptions' => false,
    ],
Laravelのドキュメントの説明でHandlerという単語が出てきますがイメージがわきにくいかと思うので簡単に説明をしておきます。monologではlogファイルにログを出力するとき、slackに送信する時と異なるプログラムを利用して処理を行います。各ログ出力に対応したコードが記述されているものがHandlerファイルです。例えばsyslogにログを出力するSyslogHandlerではファイル内でsyslog関数が実行されており、errorlogにログを出力するErrorLogHandlerではerror_log関数が実行されています。
fukidashi

ログの動作確認

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

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

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

infoレベルについては後ほど説明を行います。
fukidashi

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

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

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

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


LOG_CHANNEL=single

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

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

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

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

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