Heim > Backend-Entwicklung > PHP-Tutorial > Split -Protokollspiegel zwischen STDOut und Stderr mit Laravel

Split -Protokollspiegel zwischen STDOut und Stderr mit Laravel

Emily Anne Brown
Freigeben: 2025-03-06 02:06:14
Original
747 Leute haben es durchsucht

Split Log Levels Between Stdout and Stderr With Laravel

Haben Sie jemals darüber nachgedacht, ein bestimmtes Niveau in Laravel zu protokollieren? Natürlich können Sie die Option level Konfiguration verwenden, um die minimale -Pegel für Protokoll zu geben. Aber was ist, wenn Sie nur das und Debug Protokoll in einen bestimmten Logger protokollieren möchten? Info

Angenommen, Sie schreiben einen CLI -Befehl und möchten die Protokollierung in

und stdout teilen. Mithilfe von Tools wie Laravel Zero oder Artisan haben Sie möglicherweise den folgenden Befehl, um zu demonstrieren, dass nur das Senden von stderr an einen Ort sendet: stderr

php artisan my-command 2> storage/logs/stderr.log
Nach dem Login kopieren
Dann könnte das

-Protokoll wie folgt aussehen: stderr

Das
<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>
Nach dem Login kopieren

-Protokoll enthält Protokollinformationen auf den Ebenen stdout und INFO. DEBUG

Konfigurieren Sie Laravel auf Filterprotokollpegel

Der Trick, Laravel -Protokoller für Split -Protokolle zu konfigurieren, besteht darin, Monologs

zu verwenden, wodurch nur die angegebene Aufzeichnungsstufe durch den verpackten Handler geleitet werden kann. Ein direktes Beispiel ist wie folgt: 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]
);
Nach dem Login kopieren
Um zu veranschaulichen, wie Sie

in der Konfigurationsdatei logging.php von Laravel konfigurieren, wird hier ein benannter Parameter verwendet. Wir können die folgenden Konfigurationsänderungen in den Protokollkanälen FilterHandler und stderr verwenden (oder neue Kanäle erstellen), indem wir den Treiber stdout verwenden: 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],
        ],
    ],
];
Nach dem Login kopieren
Bitte beachten Sie, wie stimmt die Taste

mit den benannten Parametern des with -Konstruktors überein? FilterLogger Der Logger zeichnet Debug- und Informationsprotokolle auf, während der stdout -Protokollger auf stderr festgelegt wird, um eine Benachrichtigung oder höhere CLI -Fehler zu erfassen. level notice Ich möchte auch darauf hinweisen, dass das Monolog Verschlüsse des

-Handlers akzeptiert, so dass das Verpacken von

Instanzen nur dann erstellt wird, wenn der Protokollkanal verwendet wird: FilterHandler StreamHandler

Auf diese Weise fangen Protokolle für Headless/Dämon CLI -Befehle beim Senden von Protokollen von Containern an Protokolldienste nützlich. Verwenden Sie beispielsweise JSON, um die Fehlerprotokolle so zu formatieren, dass Dienste wie Datadog verwendet werden können. Hier ist ein Beispiel für die Umgebung, die Sie möglicherweise haben, die in einer
'handler' => fn () => new StreamHandler('php://stdout'),
Nach dem Login kopieren
-Datei erklärt wurde:

docker-compose.yaml

Monolog liefert viele Handler, Formatter und Prozessoren, mit denen Laravel konfiguriert werden kann, und alle gemeinsamen Anwendungsfälle sind bereits in der Konfigurationsdatei
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"
Nach dem Login kopieren
behandelt.

logging.php Sie können mehr über die Protokollierung in der Laravel -Anwendung in der offiziellen Dokumentation erfahren.

Das obige ist der detaillierte Inhalt vonSplit -Protokollspiegel zwischen STDOut und Stderr mit Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage