Maison > développement back-end > tutoriel php > Interface PSR-Logger en PHP

Interface PSR-Logger en PHP

Patricia Arquette
Libérer: 2025-01-11 16:06:43
original
833 Les gens l'ont consulté

PSR-Logger Interface in PHP

Ahnii !

Récemment, j'ai aidé une équipe à migrer de Monolog vers une solution de journalisation personnalisée. Leur journalisation n'était pas standardisée, nécessitant des modifications de code dans de nombreux fichiers. Cela met en évidence la valeur du PSR-3, une solution que je vais démontrer ici.

Comprendre le PSR-3 (5 minutes)

PSR-3 agit comme un contrat de journalisation en PHP. De la même manière qu'une conception de voiture standardisée garantit la facilité d'utilisation sur différents modèles, le PSR-3 fournit un comportement cohérent de la bibliothèque de journalisation.

1. L'interface de l'enregistreur

Ce contrat définit l'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>
Copier après la connexion

2. Niveaux de journalisation (3 minutes)

Ces niveaux représentent une échelle de gravité :

  1. Urgence : ? Panne catastrophique (système inutilisable).
  2. Alerte : ? Nécessite une action immédiate.
  3. Critique : ⚠️ Défaillance majeure d'un composant.
  4. Erreur : ❌ Panne, mais système opérationnel.
  5. Attention : ⚡ Problème potentiel.
  6. Avis : ? Événement normal mais significatif.
  7. Info : ℹ️Message d'information.
  8. Débogage : ? Informations de débogage.

Mise en œuvre dans le monde réel (10 minutes)

Créons un enregistreur qui écrit dans des fichiers et envoie des erreurs critiques à 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>
Copier après la connexion

L'utiliser dans votre projet (5 minutes)

Exemple d'utilisation :

<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>
Copier après la connexion

Intégration du framework (5 minutes)

Laravel et Symfony fournissent un support PSR-3 intégré.

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>
Copier après la connexion

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>
Copier après la connexion

Conseils rapides (2 minutes)

  1. ? Soyez précis : incluez un contexte détaillé dans les journaux.
  2. ? Utilisez le bon niveau : évitez la surutilisation des niveaux de gravité élevée.

Prochaines étapes et ressources

Cet article fait partie d'une série sur les standards PSR en PHP. Les sujets futurs incluent PSR-4.

Ressources :

  • Spécification officielle PSR-3
  • Documentation Monologue
  • Référentiel d'exemples de séries (v0.2.0 - Implémentation PSR-3)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal