Laravelでログファイルにメッセージを出力する
Laravelではログ出力をサポートしているので、すぐにログファイルへメッセージの出力ができます。
公式情報 Laravel 8.x ログ
https://readouble.com/laravel/8.x/ja/logging.html
ログを出力したいクラスに、以下のように記載します。
基本的には use Illuminate\Support\Facades\Log;
を宣言して、ログを出力したいタイミングの場所にLog::debug($message)
を書き、ログを出力します。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
class SampleController extends Controller
{
public function index(Request $req) {
// 前後略
Log::debug('デバッグ用のログを記入します');
}
}
公式にも記載されていますが、各レベルの出力方法はこちらです。レベルについはこのあと説明します。
use Illuminate\Support\Facades\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);
ログのレベル
ログのレベルとは、ログ情報の重要度のことです。Laravelのロガーは、RFC5424仕様で定義されている8つのログレベルを提供します。 emergency 、 alert 、 critical 、 error 、 warning 、 notice 、 info 、 debug です。
先頭の emergency から順番に重要度は高く、 debug が一番低い(不要な情報)ということになります。
英語だとわかりにくいかもしれないと感じたので、日本語も記載しておきます。わたしなりの意訳です。
英語 | 日本語 |
emergency | 緊急 |
alert | 警報 |
critical | 重大 |
error | 異常 |
warning | 注意 |
notice | 通知 |
info | 情報 |
debug | デバッグ |
ツチノコテクノロジーでは、先日、環境ごとのログレベルを決めました。
- 開発環境 → debug 以上を指定
- 検証環境 → info 以上を指定
- 本番環境 → notice 以上を指定
「本番環境でも伝えたいログの場合は、notice以上を指定する」ということですね!
noticeとwarningとerrorの違いとか、なかなか決めるのが難しいログレベルですが、各現場で足並みをそろえる必要がありますので、参画時に確認しましょう。
ログの出力先
ログは、どこのファイルに出力されるかは、 config/logging.php
と .env
に記載されています。
<?php
use Monolog\Handler\NullHandler;
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' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'permission' => 0664,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'permission' => 0664,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
],
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
config/logging.php
を見ると、まずログの出力パターンがいくつか定義されています。 stack、daily、slack などです。
それらの定義のうち、どれを利用しているかは、 default
で決められています。ここに 'default' => env('LOG_CHANNEL', 'stack')
とありますので、 .env
ファイルに LOG_CHANNEL
が定義されていたらそれを利用します。.env
ファイルに LOG_CHANNEL
が定義されていなかったら、stack
を利用することがわかります。
いま、わたしのプロジェクトでは、開発環境の .env
ファイルには以下のような定義がありましたので、 stack
が使われます。
LOG_CHANNEL=stack
LOG_LEVEL=debug
stack
の定義を見ると single
の定義と同じだよーと記載されています。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'permission' => 0664,
],
ここでやっと、ログは storage_path('logs/laravel.log')
に出力されることがわかりました。つまり、 storage/logs/laravel.log
になります。
ログのレベルですが、 .env
ファイルに LOG_LEVEL
を定義すると、「そのレベル以上のログを出力する」ことができます。いま、わたしの開発環境では LOG_LEVEL=debug
が定義されていますので、debug
以上(つまりすべて)のレベルのログが出力されます。上で説明したツ社のログレベルの規定は、LOG_LEVEL
を本番環境は notice
で指定するからねという決まりです。
例えば、受入テスト用の検証環境などでは、debugレベルのログは必要ない場合は、 .env
ファイルで LOG_LEVEL=info
とすることで、debugはソースコードには記載したまま、ログには出力されなくなります。これは非常に便利です。開発環境で検証環境の動作チェックをしたいときに、LOG_LEVEL
を変えて試せば、この情報は info
レベルかもなと見直すことができます。