ホームページ >バックエンド開発 >PHPチュートリアル >PHP の PSR ロガー インターフェイス
あにぃ!
最近、私は 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 サポートを提供します。
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>
シンフォニー:
<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 中国語 Web サイトの他の関連記事を参照してください。