ログローテーションとは、ログファイルが一定のファイルサイズに達したり、一定の期間が経過したらファイル名を変更しログファイルを切り分け、古くなったログファイルは消去する作業を言います。これによって、ログファイルの肥大化を防ぎます。
Laravelは、特になにも設定しない状態だと、ログはローテーションしません。
ログの設定は config/logging.php
に記載されています。
LOG_CHANNELの初期値 stack は、ログを storage/logs/laravel.log
1ファイルでずっと書き込み続けます。
<?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'),
/*
|--------------------------------------------------------------------------
| 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'),
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
],
'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' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'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'),
],
],
];
'default' => env('LOG_CHANNEL', 'stack'),
を切り替えると、下に記載されている設定が有効になります。.env
ファイルで LOG_CHANNEL=daily
と設定すれば、ログローテーションが開始できます。
LOG_CHANNEL=daily
にすると、 storage/logs/laravel-2024-10-08.log
のように、1日分ずつのログファイルが出力されるようになり、指定された日数を超えたものは削除されます。
上の設定では 'days' => 14,
が設定されていますので、laravel-2024-10-08.log
は、14日が過ぎた2024年10月23日に削除されます。
バッチとWEB両方で実行するときの注意点(エラー)
Linuxサーバーで、WEBは apache を使っていると、ログファイルのオーナーは apache になるかなと思います。
※環境構成によって違うので、なんとなく読んでください。
-rw-r--r-- 1 apache apache 12849610 Oct 8 10:53 laravel.log
このパーミッションの設定で、別ユーザーで実行するバッチが、ログを書き込もうとするとエラーになります。
例えば、AWSのEC2では ec2-user
で実行することがあると思いますが、 ec2-user
で実行したバッチがログを出力しようとすると、以下のようなエラーが出ます。フォルダパスは例ですので、自分の環境に置き換えて読んでください。
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
単純に書き込み権限が無いだけですので、以下の設定を加えて、新しいログファイルを作成すれば解決です。
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'permission' => 0775, // ここを追加
'replace_placeholders' => true,
],
'permission' => 0775,
を追加すればOKです。私はけっこう甘めの設定をしましたが、0664 のほうがいいかもしれません。
-rwxrwxr-x 1 apache apache 12849610 Oct 8 10:53 laravel.log
これでバッチの実行ユーザーがapache以外でも書き込みできるようになりました。
開発環境がWindowsだとあまり書き込み権限関連のエラーが出ないことが多いので、本番リリースの際には必ず一通りの動作検証をしたいですね!