Heim >Backend-Entwicklung >PHP-Tutorial >PSR-Logger-Schnittstelle in PHP

PSR-Logger-Schnittstelle in PHP

Patricia Arquette
Patricia ArquetteOriginal
2025-01-11 16:06:43836Durchsuche

PSR-Logger Interface in PHP

Ahnii!

Kürzlich habe ich ein Team bei der Migration von Monolog zu einer benutzerdefinierten Protokollierungslösung unterstützt. Ihre Protokollierung war nicht standardisiert und erforderte Codeänderungen in zahlreichen Dateien. Dies unterstreicht den Wert von PSR-3, einer Lösung, die ich hier demonstrieren werde.

PSR-3 verstehen (5 Minuten)

PSR-3 fungiert als Protokollierungsvertrag in PHP. Ähnlich wie ein standardisiertes Fahrzeugdesign eine einfache Bedienung über verschiedene Modelle hinweg gewährleistet, bietet PSR-3 ein konsistentes Protokollierungsbibliotheksverhalten.

1. Die Logger-Schnittstelle

Dieser Vertrag definiert die Schnittstelle:

<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. Protokollierungsebenen (3 Minuten)

Diese Stufen stellen eine Schweregradskala dar:

  1. Notfall: ? Katastrophaler Ausfall (System unbrauchbar).
  2. Alarm: ? Erfordert sofortiges Handeln.
  3. Kritisch: ⚠️ Schwerwiegender Komponentenfehler.
  4. Fehler: ❌ Fehler, aber System betriebsbereit.
  5. Warnung: ⚡ Mögliches Problem.
  6. Hinweis: ? Normales, aber bedeutendes Ereignis.
  7. Info: ℹ️ Informationsnachricht.
  8. Debug: ? Debugging-Informationen.

Reale Umsetzung (10 Minuten)

Lassen Sie uns einen Logger erstellen, der in Dateien schreibt und kritische Fehler an Slack sendet:

<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>

Verwendung in Ihrem Projekt (5 Minuten)

Beispielverwendung:

<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>

Framework-Integration (5 Minuten)

Laravel und Symfony bieten integrierte PSR-3-Unterstützung.

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>

Symfony:

<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>

Schnelle Tipps (2 Minuten)

  1. ? Seien Sie genau: Fügen Sie detaillierten Kontext in Protokolle ein.
  2. ? Verwenden Sie die richtige Stufe: Vermeiden Sie die übermäßige Verwendung von Stufen mit hohem Schweregrad.

Nächste Schritte und Ressourcen

Dieser Beitrag ist Teil einer Serie über PSR-Standards in PHP. Zukünftige Themen umfassen PSR-4.

Ressourcen:

  • Offizielle PSR-3-Spezifikation
  • Monolog-Dokumentation
  • Serien-Beispiel-Repository (v0.2.0 – PSR-3-Implementierung)

Das obige ist der detaillierte Inhalt vonPSR-Logger-Schnittstelle in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn