阿尼!
最近,我協助一個團隊從 Monolog 遷移到自訂日誌記錄解決方案。 他們的日誌記錄沒有標準化,需要跨多個文件更改代碼。 這凸顯了 PSR-3 的價值,我將在此示範解決方案。
PSR-3 充當 PHP 中的日誌合約。 與標準化汽車設計如何確保不同車型的易用性類似,PSR-3 提供一致的日誌記錄庫行為。
此合約定義了介面:
<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>
這些等級代表嚴重程度:
讓我們建立一個記錄器寫入檔案並將嚴重錯誤傳送到 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>
用法範例:
<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 和 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>
這篇文章是 PHP PSR 標準系列的一部分。 未來的主題包括 PSR-4。
資源:
以上是PHP 中的 PSR 記錄器接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!