Maison > développement back-end > tutoriel php > Diviser les niveaux de journal entre Stdout et Stderr avec Laravel

Diviser les niveaux de journal entre Stdout et Stderr avec Laravel

Emily Anne Brown
Libérer: 2025-03-06 02:06:14
original
747 Les gens l'ont consulté

Split Log Levels Between Stdout and Stderr With Laravel

Avez-vous déjà pensé à enregistrer un niveau spécifique dans Laravel? Bien sûr, vous pouvez utiliser l'option de configuration level pour spécifier le niveau minimum pour vous connecter, mais que se passe-t-il si vous souhaitez simplement enregistrer les connexions et Debug dans un enregistreur spécifique? Info

Supposons que vous écrivez une commande CLI et que vous souhaitez diviser la journalisation en

et stdout. En utilisant des outils comme Laravel Zero ou Artisan, vous pouvez avoir la commande suivante pour démontrer que l'envoi de journaux stderr à un emplacement: stderr

php artisan my-command 2> storage/logs/stderr.log
Copier après la connexion
Ensuite, le journal

peut ressembler à ceci: stderr

Le journal
<code>[2024-10-01 02:48:49] development.ERROR: The daemon has run too many times. (6 times now, come on!)
[2024-10-01 02:48:52] development.ERROR: The daemon has run too many times. (7 times now, come on!)
...</code>
Copier après la connexion

contient des informations de journal aux niveaux stdout et INFO. DEBUG

Configurer Laravel pour filtrer les niveaux de journal

L'astuce pour configurer les journalistes de Laravel pour diviser les journaux consiste à utiliser le monologue

, ce qui permet uniquement au niveau donné d'enregistrements de passer par le gestionnaire enveloppé. Un exemple direct est le suivant: FilterHandler

use Monolog\Handler\FilterHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

// 使用最小和最大级别参数
$handler = new FilterHandler(
    handler: new StreamHandler('php://stdout'),
    minLevelOrList: Level::Debug,
    maxLevel: Level::Info,
);

// 使用列表
$handler = new FilterHandler(
    handler: new StreamHandler('php://stdout'),
    minLevelOrList: [Level::Debug, Level::Info]
);
Copier après la connexion
Pour illustrer comment configurer

dans le fichier de configuration logging.php de Laravel, un paramètre nommé est utilisé ici. Nous pouvons utiliser les modifications de configuration suivantes aux canaux de journal FilterHandler et stderr (ou créer de nouveaux canaux), en utilisant le pilote stdout: stack

<?php return [
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => explode(',', env('LOG_STACK', 'stdout,stderr')),
            'ignore_exceptions' => false,
        ],

        'stdout' => [
            'driver' => 'monolog',
            'handler' => \Monolog\Handler\FilterHandler::class,
            'formatter' => env('LOG_STDOUT_FORMATTER'),
            'with' => [
                'handler' => fn () => new StreamHandler('php://stdout'),
                'minLevelOrList' => [Monolog\Level::Debug, Monolog\Level::Info],
            ],
            'processors' => [PsrLogMessageProcessor::class],
        ],

        'stderr' => [
            'driver' => 'monolog',
            'handler' => StreamHandler::class,
            'formatter' => env('LOG_STDERR_FORMATTER'),
            'with' => [
                'stream' => 'php://stderr',
            ],
            'level' => 'notice',
            'processors' => [PsrLogMessageProcessor::class],
        ],
    ],
];
Copier après la connexion
Veuillez noter, comment la clé

correspond-elle aux paramètres nommés du constructeur with? FilterLogger L'enregistreur enregistrera les journaux de débogage et d'informations, tandis que le bûcheron stdout est défini sur stderr pour prendre toute notification ou des erreurs de CLI plus élevées. level notice Je tiens également à souligner que Monolog accepte les fermetures du gestionnaire

afin que les instances d'enveloppement

soient créées uniquement lors de l'utilisation du canal de journal: FilterHandler StreamHandler

Catching des journaux de cette manière, il est utile pour les commandes CLI sans tête / démon lors de l'envoi de journaux des conteneurs aux services de journaux. Par exemple, utilisez JSON pour formater les journaux d'erreur afin que des services comme Datadog puissent être utilisés. Voici un exemple de la configuration de l'environnement que vous pourriez avoir, expliqué dans un fichier
'handler' => fn () => new StreamHandler('php://stdout'),
Copier après la connexion
:

docker-compose.yaml

Monologue fournit de nombreux gestionnaires, formateurs et processeurs qui peuvent être utilisés pour configurer dans Laravel, et tous les cas d'utilisation courants sont déjà couverts dans le fichier de configuration
services:
  cli:
    build:
      context: .
      dockerfile: build/Dockerfile
    # 不要将任何消息输出到控制台。
    # 只会发送日志。
    command: ["daemon", "--quiet"]
    environment:
      LOG_CHANNEL: "stack"
      LOG_LEVEL: "info"
      LOG_STACK: "stdout,stderr"
      LOG_STDOUT_FORMATTER: "\Monolog\Formatter\JsonFormatter"
      LOG_STDERR_FORMATTER: "\Monolog\Formatter\JsonFormatter"
Copier après la connexion
.

logging.php Vous pouvez en savoir plus sur la connexion dans l'application Laravel dans la documentation officielle.

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!

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