ホームページ >バックエンド開発 >PHPチュートリアル >laravelを使用して、stdoutとstderrの間にログレベルを分割します

laravelを使用して、stdoutとstderrの間にログレベルを分割します

Emily Anne Brown
Emily Anne Brownオリジナル
2025-03-06 02:06:14750ブラウズ

Split Log Levels Between Stdout and Stderr With Laravel

Laravelで特定のレベルを記録することを考えたことがありますか?もちろん、level構成オプションを使用してログに最小レベルを指定できますが、特定のロガーにログを記録するだけの場合はどうなりますか? CLIコマンドを書いていて、ログをDebugInfoに分割したいとします。 Laravel ZeroやArtisanのようなツールを使用して、

ログを場所に送信するだけであることを示すために、次のコマンドがある場合があります。

stdout次に、stderrログは次のようになるかもしれません:stderr

php artisan my-command 2> storage/logs/stderr.log

logには、stderrおよび

レベルでログ情報が含まれています。
<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>

LARAVELを設定して、ログレベルをフィルタリングしますstdout Laravelロガーを分割するように設定するトリックは、ログを分割することです。モノログのINFOを使用することです。これにより、与えられたレベルのレベルのみがラップされたハンドラーを通過できます。直接的な例は次のとおりです DEBUG

laravelの

構成ファイルで

を構成する方法を説明するには、ここで指定されたパラメーターが使用されます。次の構成の変更を

および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]
);

キーは、logging.phpコンストラクターの指定されたパラメーターとどのように一致していますか? FilterHandlerロガーはデバッグと情報ログを記録しますが、stderrロガーはstdoutに設定されて、通知またはより高いCLIエラーをキャッチします。 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],
        ],
    ],
];
ハンドラーの閉鎖を受け入れていることを指摘したいと思います。これにより、ラッピング

インスタンスは、ログチャネルを使用する場合にのみ作成されます。 with この方法でログをキャッチすることは、コンテナからログサービスにログを送信する際のヘッドレス/デーモンCLIコマンドに役立ちます。たとえば、JSONを使用してエラーログをフォーマットして、DataDogのようなサービスを使用できるようにします。これがあなたが持っているかもしれない環境のセットアップの例です、FilterLoggerファイルで説明されています:stdout stderr levelMonologは、Laravelで構成するために使用できる多くのハンドラー、フォーマッタ、およびプロセッサを提供し、すべての一般的なユースケースはnotice構成ファイルで既にカバーされています。

公式文書のLaravelアプリケーションのログの詳細について詳しく知ることができます。 FilterHandler

以上がlaravelを使用して、stdoutとstderrの間にログレベルを分割しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。