首頁 >後端開發 >php教程 >PHP 中的 PSR 記錄器接口

PHP 中的 PSR 記錄器接口

Patricia Arquette
Patricia Arquette原創
2025-01-11 16:06:43839瀏覽

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 支援。

拉拉維爾:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn