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
Emily Anne Brownoriginal
2025-03-06 02:06:14750parcourir

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

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]
);
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],
        ],
    ],
];
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'),
:

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

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