0Pricing
PHP Academy · レッスン

エラーのログ記録とベストプラクティス

エラーをファイルに記録し、本番環境向けのエラー処理パターンに従います

「エラーのログ記録とベストプラクティス」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

ロギングが重要な理由

本番環境では、ユーザーにエラーを表示できませんが、問題が発生したことを把握する必要があります。ロギングを使うと、エラーの詳細をファイルやサービスに記録し、後から調査できます。

error_log()

最も単純なロギング関数で、PHP のエラーログにメッセージを書き込みます。

<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');

// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');

構造化ロギング

解析や検索を容易にするため、構造化データを JSON として記録します。

<?php
function logEvent(string $level, string $message, array $context = []): void {
    $entry = array_merge([
        'ts'      => date('c'),
        'level'   => $level,
        'message' => $message,
    ], $context);

    error_log(json_encode($entry));
}

logEvent('ERROR', 'Payment failed', [
    'order_id' => 123,
    'amount'   => 99.99,
    'user_id'  => 45,
]);

ログレベル(PSR-3)

PSR-3 では、標準的なログレベルを定義しています。

  • emergency — システムが使用不能です
  • alert — 対応が必要です
  • critical — 重大な状態です
  • error — 実行時エラーです
  • warning — エラーではない異常な事象です
  • notice — 正常ですが重要なイベントです
  • info — 情報メッセージです
  • debug — 詳細なデバッグ情報です

Monolog ロガー

Monolog は、PSR-3 に対応した PHP の標準的なロギングライブラリです。

<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));

$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);

本番環境での例外処理

例外を記録し、安全なレスポンスを返す本番環境向けの例外ハンドラーです。

<?php
set_exception_handler(function(\Throwable $e) {
    $id = uniqid('err_');
    error_log(json_encode([
        'error_id' => $id,
        'class'    => get_class($e),
        'message'  => $e->getMessage(),
        'file'     => $e->getFile(),
        'line'     => $e->getLine(),
        'trace'    => $e->getTraceAsString(),
    ]));
    http_response_code(500);
    echo json_encode(['error' => 'Server error', 'id' => $id]);
    exit(1);
});

ログローテーション

ログファイルは無制限に増大するため、Linux では logrotate を、Monolog では時間ベースのハンドラーを使ってローテーションします。

<?php
use Monolog\Handler\RotatingFileHandler;

$handler = new RotatingFileHandler(
    '/var/log/app.log',
    30,              // keep 30 days
    Logger::DEBUG
);

// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);

コンテキスト豊富なロギング

デバッグを容易にするため、すべてのログエントリにリクエストのコンテキストを含めます。

<?php
function getRequestContext(): array {
    return [
        'url'     => $_SERVER['REQUEST_URI'] ?? '',
        'method'  => $_SERVER['REQUEST_METHOD'] ?? '',
        'ip'      => $_SERVER['REMOTE_ADDR'] ?? '',
        'user_id' => $_SESSION['user_id'] ?? null,
    ];
}

// Add to every log call:
$log->error('Order failed', array_merge(
    getRequestContext(),
    ['order_id' => $orderId]
));

ログへの機密データの記録を避ける

機密情報は決して記録しないでください。

  • パスワードとトークン
  • クレジットカード番号
  • 個人データ(GDPR に準拠するため)
  • ユーザー向けレスポンスに含める完全な例外スタックトレース
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);

// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');

Sentry と外部エラートラッキング

本番環境では、Sentry などのエラートラッキングサービスを使って、エラーを一元管理し、通知を受け取ります。

<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);

// Automatic capture of unhandled exceptions
// Manual capture:
try {
    processOrder();
} catch (\Throwable $e) {
    \Sentry\captureException($e);
    throw $e;
}

アサーションによる事前条件チェック

開発中のプログラミングエラーを検出するには、アサーションを使用します。

<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');

// Or throw explicitly:
if (!is_int($userId)) {
    throw new \InvalidArgumentException('userId must be int');
}

理解度チェック

PSR-3 で、直ちに対応が必要な状況を示すログレベルはどれですか。

まとめ:エラーロギング

ロギングのベストプラクティス:

  • タイムスタンプ、レベル、メッセージ、コンテキストを含む構造化 JSON ロギングを使用します
  • PSR-3 のログレベルに従います
  • 本番アプリケーションでは Monolog を使用します
  • ディスク容量が使い果たされないよう、ログをローテーションします
  • パスワードや機密データは決して記録しません
  • Sentry などを使ってリアルタイムでエラーを追跡します

よくある質問

「エラーのログ記録とベストプラクティス」レッスンは無料ですか?

はい。「エラーのログ記録とベストプラクティス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「エラーのログ記録とベストプラクティス」で何を学びますか?

エラーをファイルに記録し、本番環境向けのエラー処理パターンに従います ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「エラーのログ記録とベストプラクティス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. PHPのエラーの種類と報告
  2. Try、Catch、Finally
  3. カスタム例外の作成
  4. エラーのログ記録とベストプラクティス
← PHP Academyに戻る