Heim >Backend-Entwicklung >PHP-Tutorial >PSR-Logger-Schnittstelle 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 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.
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>
Diese Stufen stellen eine Schweregradskala dar:
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>
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>
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>
Dieser Beitrag ist Teil einer Serie über PSR-Standards in PHP. Zukünftige Themen umfassen PSR-4.
Ressourcen:
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!