ログ情報
ログレベル
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()
の0
と4
のメッセージタイプのみがサポートされています。
ハンドラーは、メイン設定ファイルの$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()
関数を通じて行われた呼び出しは、代わりにあなたのライブラリを使用します。