Rumah >pembangunan bahagian belakang >tutorial php >Tahap log berpecah antara stdout dan stderr dengan laravel
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
. Menggunakan alat seperti Laravel Zero atau Artisan, anda mungkin mempunyai arahan berikut untuk menunjukkan bahawa hanya menghantar stdout
log ke lokasi: stderr
stderr
php artisan my-command 2> storage/logs/stderr.logmungkin 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>mengandungi maklumat log pada tahap
dan stdout
. INFO
DEBUG
Konfigurasi Laravel untuk menapis tahap log
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] );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
<?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], ], ], ];?
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'),
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"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!