Home > Backend Development > PHP Tutorial > PSR-Logger Interface in PHP

PSR-Logger Interface in PHP

Patricia Arquette
Release: 2025-01-11 16:06:43
Original
834 people have browsed it

PSR-Logger Interface in PHP

Ahnii!

Recently, I assisted a team migrating from Monolog to a custom logging solution. Their logging wasn't standardized, requiring code changes across numerous files. This highlights the value of PSR-3, a solution I'll demonstrate here.

Understanding PSR-3 (5 minutes)

PSR-3 acts as a logging contract in PHP. Similar to how a standardized car design ensures ease of operation across different models, PSR-3 provides consistent logging library behavior.

1. The Logger Interface

This contract defines the interface:

<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>
Copy after login

2. Log Levels (3 minutes)

These levels represent a severity scale:

  1. Emergency: ? Catastrophic failure (system unusable).
  2. Alert: ? Requires immediate action.
  3. Critical: ⚠️ Major component failure.
  4. Error: ❌ Failure, but system operational.
  5. Warning: ⚡ Potential problem.
  6. Notice: ? Normal but significant event.
  7. Info: ℹ️ Informational message.
  8. Debug: ? Debugging information.

Real-World Implementation (10 minutes)

Let's create a logger writing to files and sending critical errors to 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>
Copy after login

Using It In Your Project (5 minutes)

Example usage:

<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>
Copy after login

Framework Integration (5 minutes)

Laravel and Symfony provide built-in PSR-3 support.

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>
Copy after login

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>
Copy after login

Quick Tips (2 minutes)

  1. ? Be Specific: Include detailed context in logs.
  2. ? Use the Right Level: Avoid overuse of high-severity levels.

Next Steps & Resources

This post is part of a series on PSR standards in PHP. Future topics include PSR-4.

Resources:

  • Official PSR-3 Specification
  • Monolog Documentation
  • Series Example Repository (v0.2.0 - PSR-3 Implementation)

The above is the detailed content of PSR-Logger Interface in PHP. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template