【Laravel】ログの出力方法とconfig/logging.phpについて理解する

Laravel,PHP

今回はログの出力方法とconfig/logging.phpについて理解の紹介です。

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

ログの表示のさせ方

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: 緊急用のログファイルに記録します。
icon

各オブジェクトの詳細を知りたい場合は次のチャンネル別詳細を確認してください。

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」が設定を見て、さらに深掘りしていきます。

icon

今回では’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

サーバー上にログを表示

icon

サーバー上にログを表示するには’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,
        ],

Laravel,PHPLaravel

Posted by kami