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.log
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>
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] );
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"
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!