【Laravel】ログの出力方法とconfig/logging.phpについて理解する
今回はログの出力方法とconfig/logging.phpについて理解の紹介です。
ログの表示のさせ方
Logを表示させる方法です
use Illuminate\Support\Facades\Log;
\Log::info('Laravelアプリ内で表示させたい内容')
クラスをインポートして、規定の書き方に沿ってログを出力させたい内容を記述します。
ログの記述方法
通常の操作のログ出力に使用されます。
Log::info('Laravel ログ')
デバッグ情報をログに記録します。
通常は開発中のみに使用され、本番環境では無効にします。
Log::debug($request)
Log::debug('ユーザーの確認', ['ユーザー']=> [$user_id]);
エラーをログに記録します。
Log::error(`エラーが発生したユーザー: ${user_id}`);
文字列だけではなく、変数やオブジェクトなども出力できます。
<?php
namespace Illuminate\Support\Facades;
/**
* @method static \Psr\Log\LoggerInterface channel(string $channel = null)
* @method static \Psr\Log\LoggerInterface stack(array $channels, string $channel = null)
* @method static \Psr\Log\LoggerInterface build(array $config)
* @method static \Illuminate\Log\Logger withContext(array $context = [])
* @method static \Illuminate\Log\Logger withoutContext()
* @method static void alert(string $message, array $context = [])
* @method static void critical(string $message, array $context = [])
* @method static void debug(string $message, array $context = [])
* @method static void emergency(string $message, array $context = [])
* @method static void error(string $message, array $context = [])
* @method static void info(string $message, array $context = [])
* @method static void log($level, string $message, array $context = [])
* @method static void notice(string $message, array $context = [])
* @method static void warning(string $message, array $context = [])
* @method static void write(string $level, string $message, array $context = [])
* @method static void listen(\Closure $callback)
*
* @see \Illuminate\Log\Logger
*/
class Log extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'log';
}
}
使用できるLogはログクラスに記載されています。
ログの出力場所
デフォルトでは「storage/logs/laravel.log」に出力されます。
storage/logs/laravel-2024-05-27.log
スポンサードサーチ
ログ出力の設定:config/logging.php
ログ出力の設定は「config/logging.php」で行います。
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
use Monolog\Processor\PsrLogMessageProcessor;
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'),
/*
|--------------------------------------------------------------------------
| Deprecations Log Channel
|--------------------------------------------------------------------------
|
| This option controls the log channel that should be used to log warnings
| regarding deprecated PHP and library features. This allows you to get
| your application ready for upcoming major versions of dependencies.
|
*/
'deprecations' => [
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
'trace' => false,
],
/*
|--------------------------------------------------------------------------
| 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'),
'replace_placeholders' => true,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'replace_placeholders' => true,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
'replace_placeholders' => true,
],
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
],
'processors' => [PsrLogMessageProcessor::class],
],
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
'processors' => [PsrLogMessageProcessor::class],
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
'facility' => LOG_USER,
'replace_placeholders' => true,
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
ログチャネル
「channels」では、アプリケーションのログチャンネルを設定できます。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
// 以下省略
ログチャネルの各説明です。
- stack: 複数のチャネルをまとめて1つのチャネルとして扱います。デフォルトでは
single
チャネルを含みます。 - single: 単一のログファイル(
laravel.log
)にログを記録します。 - daily: 日ごとにログファイルを分割して記録します。デフォルトでは14日間保持します。
- slack: Slackのチャンネルにログを送信します。Webhook URLが必要です。
- papertrail: Papertrailという外部サービスにログを送信します。ホストとポートが必要です。
- stderr: 標準エラー出力にログを記録します。
- syslog: Syslogにログを送信します。
- errorlog: PHPのエラーログに記録します。
- null: ログを破棄します(ログ記録を無効にします)。
- emergency: 緊急用のログファイルに記録します。
各オブジェクトの詳細を知りたい場合は次のチャンネル別詳細を確認してください。
stack
driver
:stack
ドライバは、複数のチャンネルをスタック(積み重ね)として扱い、まとめてログを記録します。channels
: スタックに含めるチャンネルのリスト。この場合、single
チャンネルのみが含まれています。ignore_exceptions
:false
に設定すると、ログチャンネルに例外が発生した場合に無視しないでエラーとして扱います。
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
single
driver
:single
ドライバは、単一のログファイルにログを記録します。path
: ログファイルの保存先パス。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。replace_placeholders
: メッセージ内のプレースホルダを置き換えるかどうか。
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
daily
driver
:daily
ドライバは、日ごとにログファイルを分割します。path
: ログファイルの保存先パス。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。days
: ログファイルを保持する日数。replace_placeholders
: メッセージ内のプレースホルダを置き換えるかどうか。
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'replace_placeholders' => true,
],
slack
driver
:slack
ドライバは、Slackにログを送信します。url
: SlackのWebhook URL。環境変数LOG_SLACK_WEBHOOK_URL
から取得。username
: Slackに表示されるユーザー名。emoji
: メッセージに付ける絵文字。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはcritical
。replace_placeholders
: メッセージ内のプレースホルダを置き換えるかどうか。
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => env('LOG_LEVEL', 'critical'),
'replace_placeholders' => true,
],
papertrail
driver
:monolog
ドライバを使用。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。handler
: 使用するハンドラー。環境変数LOG_PAPERTRAIL_HANDLER
から取得し、デフォルトはSyslogUdpHandler
。handler_with
: ハンドラーの設定。ホストやポートなど。processors
: 使用するプロセッサ。ここではPsrLogMessageProcessor
。
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
],
'processors' => [PsrLogMessageProcessor::class],
],
stderr
driver
:monolog
ドライバを使用。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。handler
: 使用するハンドラー。ここではStreamHandler
。formatter
: 使用するフォーマッタ。環境変数LOG_STDERR_FORMATTER
から取得。with
: ハンドラーに渡すオプション。ここでは標準エラー出力(php://stderr
)。processors
: 使用するプロセッサ。ここではPsrLogMessageProcessor
。
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
'processors' => [PsrLogMessageProcessor::class],
],
syslog
driver
:syslog
ドライバを使用。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。facility
: Syslogのファシリティ。replace_placeholders
: メッセージ内のプレースホルダを置き換えるかどうか。
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
'facility' => LOG_USER,
'replace_placeholders' => true,
],
errorlog
driver
:errorlog
ドライバを使用。level
: ログレベル。環境変数LOG_LEVEL
から取得し、デフォルトはdebug
。replace_placeholders
: メッセージ内のプレースホルダを置き換えるかどうか。
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
null
driver
:monolog
ドライバを使用。handler
: 使用するハンドラー。ここではNullHandler
(ログを破棄)。
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
emergency
path
: 緊急用ログファイルの保存先パス。
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
スポンサードサーチ
現在の設定の確認
「default」のenvの「LOG_CHANNEL」がどこに設定されているのかを確認します
default' => env('LOG_CHANNEL', 'stack'),
今回は「stack」になっているのを確認できたので、「stack」の設定を見にいきます。
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
「channels」が設定を見て、さらに深掘りしていきます。
今回では’channels’ => ['single’]なので、
「single」の設定を見にいきます。
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
「path」ログファイルの保存場所になります。
「storage/logs/laravel.log」に保存されます。
「level」はログレベルです。
デフォルトでは.env
ファイルで指定されたLOG_LEVEL
が使用され、指定がない場合はdebug
レベルになります。
「replace_placeholders」はログメッセージ内のプレースホルダーを置き換えるかどうかを制御します。true
に設定されているため、プレースホルダーが置き換えられます。
replace_placeholdersの説明
プレースホルダーの置き換えに関して、Laravelのログ設定では、ログメッセージ内で特定のプレースホルダー(例えば、:user
、:id
など)を使って、ログメッセージのテンプレートをより柔軟に定義することができます。
replace_placeholders」が「true」に設定されている場合、これらのプレースホルダーが実際の値に置き換えられます。
\Log::info('User :user created a new post with ID :id', ['user' => 'Kami', 'id' => 1]);
「replace_placeholders」が「true」に設定されている場合、ログメッセージは以下のように記録されます。
User Kami created a new post with ID 1
サーバー上にログを表示
サーバー上にログを表示するには’channels’ => ['stderr’]を使用します。
'stack' => [
'driver' => 'stack',
'channels' => ['stderr'],
'ignore_exceptions' => false,
],
正しく言うと、「php://stderr」ストリームにログを送るように設定されているので、サーバー上のログやコンソールに出力されるようになっています。
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
スポンサードサーチ
日別のログファイルの作成
日別のログファイルの作成するには、’channels’ => ['stderr’, 'daily’]を使用します。
'stack' => [
'driver' => 'stack',
'channels' => ['stderr', 'daily'],
'ignore_exceptions' => false,
],
「storage/logs/laravel-2024-06-01.log」のような日付付きのログが表示されます。
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'replace_placeholders' => true,
],