[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

>백엔드 개발 >PHP 튜토리얼 >PHP의 PSR-로거 인터페이스

PHP의 PSR-로거 인터페이스

Patricia Arquette
Patricia Arquette원래의
2025-01-11 16:06:43845검색

PSR-Logger Interface in PHP

안녕!

최근에는 Monolog에서 맞춤형 로깅 솔루션으로 마이그레이션하는 팀을 도왔습니다. 로깅이 표준화되지 않았으므로 수많은 파일에서 코드를 변경해야 했습니다. 이는 여기서 시연할 솔루션인 PSR-3의 가치를 강조합니다.

PSR-3 이해(5분)

PSR-3은 PHP에서 로깅 계약 역할을 합니다. 표준화된 자동차 설계가 다양한 모델에서 작동의 용이성을 보장하는 것과 유사하게 PSR-3은 일관된 로깅 라이브러리 동작을 제공합니다.

1. 로거 인터페이스

이 계약은 인터페이스를 정의합니다.

<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. 로그 수준(3분)

다음 수준은 심각도 척도를 나타냅니다.

  1. 긴급 상황: ? 치명적인 오류(시스템을 사용할 수 없음).
  2. 경보: ? 즉각적인 조치가 필요합니다.
  3. 심각: ⚠️ 주요 구성 요소 오류.
  4. 오류: ❌ 실패했지만 시스템은 작동합니다.
  5. 경고: ⚡ 잠재적인 문제.
  6. 공지사항: ? 평범하지만 뜻깊은 행사.
  7. 정보: ℹ️ 정보 메시지.
  8. 디버그: ? 디버깅 정보.

실제 구현(10분)

파일에 쓰고 심각한 오류를 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>

프로젝트에 사용하기(5분)

사용 예:

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

프레임워크 통합(5분)

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>

빠른 팁(2분)

  1. ? 구체적: 로그에 자세한 컨텍스트를 포함합니다.
  2. ? 적절한 수준 사용: 심각도가 높은 수준을 과도하게 사용하지 마세요.

다음 단계 및 리소스

이 게시물은 PHP의 PSR 표준 시리즈의 일부입니다. 향후 주제에는 PSR-4가 포함됩니다.

자원:

  • PSR-3 공식 사양
  • 모놀로그 문서
  • 시리즈 예제 저장소(v0.2.0 - PSR-3 구현)

위 내용은 PHP의 PSR-로거 인터페이스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.