Rumah > pembangunan bahagian belakang > tutorial php > Tahap log berpecah antara stdout dan stderr dengan laravel

Tahap log berpecah antara stdout dan stderr dengan laravel

Emily Anne Brown
Lepaskan: 2025-03-06 02:06:14
asal
747 orang telah melayarinya

Split Log Levels Between Stdout and Stderr With Laravel

Pernahkah anda berfikir tentang pembalakan tahap tertentu di Laravel? Sudah tentu, anda boleh menggunakan pilihan konfigurasi

untuk menentukan tahap minimum level untuk log, tetapi bagaimana jika anda hanya mahu log dan log ke dalam logger tertentu? Debug Info Katakan anda menulis arahan CLI dan ingin memecah pembalakan ke

dan

. Menggunakan alat seperti Laravel Zero atau Artisan, anda mungkin mempunyai arahan berikut untuk menunjukkan bahawa hanya menghantar stdout log ke lokasi: stderr stderr

maka, log
php artisan my-command 2> storage/logs/stderr.log
Salin selepas log masuk
mungkin kelihatan seperti ini:

stderr Log

<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>
Salin selepas log masuk
mengandungi maklumat log pada tahap

dan stdout. INFO DEBUG Konfigurasi Laravel untuk menapis tahap log

Trik untuk mengkonfigurasi Laravel Loggers untuk memecah log adalah dengan menggunakan Monolog's

, yang hanya membolehkan tahap rekod yang diberikan untuk melewati pengendali yang dibungkus. Contoh langsung adalah seperti berikut:

FilterHandler

Untuk menggambarkan cara mengkonfigurasi
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]
);
Salin selepas log masuk
dalam fail konfigurasi Laravel, parameter yang dinamakan digunakan di sini. Kita boleh menggunakan perubahan konfigurasi berikut ke saluran log

dan logging.php (atau membuat saluran baru), menggunakan pemandu FilterHandler: stderr stdout stack Sila ambil perhatian, bagaimanakah kekunci

sepadan dengan parameter yang dinamakan pembina
<?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],
        ],
    ],
];
Salin selepas log masuk
?

Logger akan merakam debug dan log maklumat, manakala logger with ditetapkan ke FilterLogger untuk menangkap sebarang pemberitahuan atau kesilapan CLI yang lebih tinggi. stdout stderr Saya juga ingin menunjukkan bahawa monolog menerima penutupan level pengendali supaya pembungkus notice contohnya dibuat hanya apabila menggunakan saluran log:

FilterHandler Menangkap log dengan cara ini berguna untuk perintah Headless/Daemon CLI apabila menghantar log dari bekas ke perkhidmatan log. Sebagai contoh, gunakan JSON untuk memformat log ralat supaya perkhidmatan seperti Datadog boleh digunakan. Berikut adalah contoh persediaan persekitaran yang mungkin anda miliki, dijelaskan dalam fail StreamHandler:

'handler' => fn () => new StreamHandler('php://stdout'),
Salin selepas log masuk

Monolog menyediakan banyak pengendali, formatters, dan pemproses yang boleh digunakan untuk mengkonfigurasi di Laravel, dan semua kes penggunaan biasa telah diliputi dalam fail konfigurasi docker-compose.yaml.

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"
Salin selepas log masuk
Anda boleh mengetahui lebih lanjut mengenai pembalakan dalam aplikasi Laravel dalam dokumentasi rasmi.

Atas ialah kandungan terperinci Tahap log berpecah antara stdout dan stderr dengan laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan