ログ情報

ログレベル

log_message()メソッドを使用して、ローカルログファイルに情報を記録できます。最初の引数にはエラーの「レベル」を指定し、メッセージの種類(デバッグ、エラーなど)を示す必要があります。2番目の引数はメッセージ自体です。

<?php

if ($some_var === '') {
    log_message('error', 'Some variable did not contain a value.');
}

RFC 5424のレベルに合わせた8種類のログレベルがあり、それらは以下のとおりです。

レベル

説明

debug

詳細なデバッグ情報。

info

ユーザーのログイン、SQLクエリのログ記録など、アプリケーションにおける興味深いイベント。

notice

アプリケーションにおける通常だが重要なイベント。

warning

エラーではないが例外的な発生事項。非推奨APIの使用、APIの誤用、または必ずしも間違ってはいないが望ましくない事柄など。

error

即時対応は必要ないが、通常はログに記録して監視する必要がある実行時エラー。

critical

アプリケーションコンポーネントが使用できない場合や予期しない例外など、重大な状況。

alert

ウェブサイト全体がダウンしている場合やデータベースが使用できない場合など、すぐに対応が必要な状況。

emergency

システムが使用不能。

ログシステムは、これらのイベントについてシステム管理者またはウェブマスターに警告する方法を提供していません。情報は単にログに記録されるだけです。より重大なイベントレベルの多くでは、上記で説明したエラーハンドラーによって自動的にログ記録が行われます。

設定

**app/Config/Logger.php**設定ファイル内で、実際にログに記録されるレベルを変更したり、さまざまなレベルを処理する異なるロガーを割り当てたりできます。

設定ファイルのthreshold値は、アプリケーション全体でログに記録されるレベルを決定します。アプリケーションによってログに記録するよう要求されたレベルが、現在のしきい値ではログに記録できない場合、それらは無視されます。最も簡単な方法は、ログに記録する最小レベルにこの値を設定することです。たとえば、情報メッセージではなく警告メッセージをログに記録する場合は、しきい値を5に設定します。レベル5以下のログ要求(実行時エラー、システムエラーなど)はログに記録され、info、notice、debugは無視されます。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    public $threshold = 5;

    // ...
}

レベルとその対応するしきい値の完全なリストは、参考のために設定ファイルに記載されています。

しきい値にログレベル番号の配列を割り当てることで、ログに記録する特定のレベルを選択できます。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    // Log only debug and info type messages
    public $threshold = [5, 8];

    // ...
}

複数のログハンドラの使用

ログシステムは、同時に複数のログ処理方法をサポートできます。各ハンドラーは、特定のレベルを処理し、残りを無視するように設定できます。現在、デフォルトインストールには3つのハンドラーが付属しています。

  • **File Handler**はデフォルトのハンドラーであり、ローカルに毎日1つのファイルを作成します。これは推奨されるログ記録方法です。

  • **ChromeLogger Handler** ChromeウェブブラウザにChromeLogger拡張機能をインストールしている場合、このハンドラーを使用して、Chromeのコンソールウィンドウにログ情報を表示できます。

  • **Errorlog Handler** このハンドラーは、PHPのネイティブなerror_log()関数を活用して、ログをそこに書き込みます。現在、error_log()04のメッセージタイプのみがサポートされています。

ハンドラーは、メイン設定ファイルの$handlersプロパティで設定されます。これは、ハンドラーとその設定の配列です。各ハンドラーは、キーが完全な名前空間付きクラス名で指定されます。値は、各ハンドラーに固有のさまざまなプロパティの配列になります。各ハンドラーのセクションには、共通のプロパティhandlesが1つ含まれています。これは、ハンドラーが情報をログに記録するログレベルの*名前*の配列です。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Logger extends BaseConfig
{
    public $handlers = [
        // File Handler
        'CodeIgniter\Log\Handlers\FileHandler' => [
            'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'],
        ],
    ];

    // ...
}

コンテキストによるメッセージの変更

ログに記録されるイベントのコンテキストに基づいて、メッセージの詳細を変更することがよくあります。ユーザーID、IPアドレス、現在のPOST変数などをログに記録する必要がある場合があります。これは、メッセージ内でプレースホルダーを使用することで実行できます。各プレースホルダーは、波かっこで囲む必要があります。3番目の引数には、プレースホルダー名(波かっこなし)とその値の配列を指定する必要があります。これらはメッセージ文字列に挿入されます。

<?php

// Generates a message like: User 123 logged into the system from 127.0.0.1
$info = [
    'id'         => $user->id,
    'ip_address' => $this->request->getIPAddress(),
];

log_message('info', 'User {id} logged into the system from {ip_address}', $info);

例外またはエラーをログに記録する場合は、「exception」のキーと、例外またはエラー自体を値として使用できます。エラーメッセージ、ファイル名、行番号を含む文字列がそのオブジェクトから生成されます。それでも、メッセージに例外プレースホルダーを指定する必要があります。

<?php

try {
    // Something throws error here
} catch (\Exception $e) {
    log_message('error', '[ERROR] {exception}', ['exception' => $e]);
}

現在のページリクエストに基づいて自動的に展開されるコアプレースホルダーがいくつか存在します。

プレースホルダー

挿入された値

{post_vars}

$_POST変数

{get_vars}

$_GET変数

{session_vars}

$_SESSION変数

{env}

現在の環境名(開発など)

{file}

ロガーを呼び出したファイルの名前

{line}

{file}内のロガーが呼び出された行

{env:foo}

$_ENV内の'foo'の値

サードパーティのロガーの使用

Psr\Log\LoggerInterfaceのいずれかを拡張し、PSR-3に準拠している限り、任意の他のロガーを使用できます。つまり、任意のPSR-3互換ロガーを簡単に使用したり、独自に作成したりできます。

**app/Config/Autoload.php**設定ファイルまたはComposerなどの別のオートローダーに追加することで、システムがサードパーティのロガーを見つけられるようにする必要があります。次に、**app/Config/Services.php**を変更して、loggerエイリアスを新しいクラス名に設定します。

これで、log_message()関数を通じて行われた呼び出しは、代わりにあなたのライブラリを使用します。