안녕!
최근에는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!