ホームページ >バックエンド開発 >PHPチュートリアル >PHP の PSR ロガー インターフェイス

PHP の PSR ロガー インターフェイス

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-11 16:06:43836ブラウズ

PSR-Logger Interface in PHP

あにぃ!

最近、私は Monolog からカスタム ログ ソリューションに移行するチームを支援しました。 彼らのロギングは標準化されていなかったため、多数のファイルにわたるコードの変更が必要でした。 これは、ここで説明するソリューションである PSR-3 の価値を強調しています。

PSR-3 を理解する (5 分)

PSR-3 は、PHP のロギング コントラクトとして機能します。 標準化された自動車設計がさまざまなモデル間で操作を容易にするのと同様に、PSR-3 は一貫したロギング ライブラリの動作を提供します。

1.ロガーインターフェース

このコントラクトはインターフェースを定義します:

<code class="language-php"><?php namespace Psr\Log;

interface LoggerInterface
{
    public function emergency($message, array $context = array());
    public function alert($message, array $context = array());
    public function critical($message, array $context = array());
    public function error($message, array $context = array());
    public function warning($message, array $context = array());
    public function notice($message, array $context = array());
    public function info($message, array $context = array());
    public function debug($message, array $context = array());
    public function log($level, $message, array $context = array());
}

?></code>

2.ログレベル (3 分)

これらのレベルは重大度スケールを表します:

  1. 緊急: ?致命的な障害 (システムが使用不能)。
  2. アラート: ?早急な対応が必要です。
  3. 重大: ⚠️ 主要コンポーネントの障害。
  4. エラー: ❌ 障害が発生しましたが、システムは動作しています。
  5. 警告: ⚡ 潜在的な問題。
  6. 注意: ?普通だが重要なイベント。
  7. 情報: ℹ️ 情報メッセージ。
  8. デバッグ: ?デバッグ情報。

実際の実装 (10 分)

ファイルに書き込み、重大なエラーを Slack に送信するロガーを作成してみましょう:

<code class="language-php"><?php namespace App\Logging;

use Psr\Log\AbstractLogger;
use Psr\Log\LogLevel;

class SmartLogger extends AbstractLogger
{
    private $logFile;
    private $slackWebhook;

    public function __construct(string $logFile, string $slackWebhook)
    {
        $this->logFile = $logFile;
        $this->slackWebhook = $slackWebhook;
    }

    public function log($level, $message, array $context = array())
    {
        $timestamp = date('Y-m-d H:i:s');
        $message = $this->interpolate($message, $context);
        $logLine = "[$timestamp] [$level] $message" . PHP_EOL;

        file_put_contents($this->logFile, $logLine, FILE_APPEND);

        if (in_array($level, [LogLevel::CRITICAL, LogLevel::EMERGENCY])) {
            $this->notifySlack($level, $message);
        }
    }

    private function notifySlack($level, $message)
    {
        $emoji = $level === LogLevel::EMERGENCY ? '?' : '⚠️';
        $payload = json_encode([
            'text' => "$emoji *$level*: $message"
        ]);

        $ch = curl_init($this->slackWebhook);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        curl_close($ch);
    }

    private function interpolate($message, array $context = array())
    {
        $replace = array();
        foreach ($context as $key => $val) {
            $replace['{' . $key . '}'] = $val;
        }
        return strtr($message, $replace);
    }
}</code>

プロジェクトでの使用 (5 分)

使用例:

<code class="language-php">$logger = new SmartLogger(
    '/var/log/app.log',
    'https://hooks.slack.com/services/YOUR/WEBHOOK/HERE'
);

$logger->info('User {user} logged in from {ip}', [
    'user' => 'jonesrussell',
    'ip' => '192.168.1.1'
]);

$logger->critical('Payment gateway {gateway} is down!', [
    'gateway' => 'Stripe',
    'error_code' => 500
]);</code>

フレームワークの統合 (5 分)

Laravel と Symfony は組み込みの PSR-3 サポートを提供します。

Laravel:

<code class="language-php">public function processOrder($orderId)
{
    try {
        Log::info('Order processed', ['order_id' => $orderId]);
    } catch (\Exception $e) {
        Log::error('Order failed', [
            'order_id' => $orderId,
            'error' => $e->getMessage()
        ]);
        throw $e;
    }
}</code>

シンフォニー:

<code class="language-php">class OrderController extends AbstractController
{
    public function process(LoggerInterface $logger, string $orderId)
    {
        $logger->info('Starting order process', ['order_id' => $orderId]);
        // Your code here
    }
}</code>

簡単なヒント (2 分)

  1. ? 具体的である: ログに詳細なコンテキストを含めます。
  2. ? 適切なレベルを使用する: 重大度の高いレベルの過度の使用は避けてください。

次のステップとリソース

この投稿は、PHP の PSR 標準に関するシリーズの一部です。 今後のトピックには PSR-4 が含まれます。

リソース:

  • PSR-3 の公式仕様
  • モノローグドキュメント
  • シリーズ サンプル リポジトリ (v0.2.0 - PSR-3 実装)

以上がPHP の PSR ロガー インターフェイスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。