Laravelのログ出力とログレベル

Laravel
  • URLをコピーしました!
目次

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レベルのログは必要ない場合は、 .env ファイルで LOG_LEVEL=info とすることで、debugはソースコードには記載したまま、ログには出力されなくなります。これは非常に便利です。

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次