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

PSR-Logger Interface in PHP

Patricia Arquette
Patricia ArquetteOriginal
2025-01-11 16:06:43836browse

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>

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>

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>

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>

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>

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!

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