ホームページ >バックエンド開発 >PHPチュートリアル >PHPマスター|再利用性を向上させるために、PSR-3でロギングします
コアポイント
log()
AbstractLogger
PSR-3がコードをより再利用可能にする方法を理解する前に、PSR-3とは何かを理解する必要があります。すでにPSR-3に精通している場合は、このセクションをスキップできます。仕様のコアは、オブジェクトをログするためのインターフェイスです。このインターフェイスは、異なる重大度レベルのメッセージを処理する8つの方法と、重大度レベルを受け入れる可能性のある一般的な
メソッドを開示します。 PSR-3でサポートされている8つの重大度レベルは、以下で説明するようにRFC 5424に基づいています。emergency
- システムは使用できませんalert
- アクションが必要ですcritical
- 深刻な状況error
- 即座に注意を必要としないが監視する必要があるエラーwarning
- 珍しいまたは望ましくないイベントですが、エラーではありませんnotice
- 通常の重要なイベントinfo
- 興味深いイベントdebug
- デバッグの詳細各ログメソッドは、文字列または__toString()
メソッドを備えたオブジェクトでなければならないメッセージを受け入れます。追加のパラメーターは、ログメッセージのコンテキスト情報を提供できる配列を受け入れます。これらの方法とパラメーターの完全な説明は、PSR-3仕様に記載されています。
psr-3ファイルを取得
PSR -3を使用するために必要なファイルを取得するのは簡単です - PSR/Log GitHubリポジトリでそれらを見つけることができます。 Composerを使用して、これらのファイルをPackagistから取得することもできます。 PSR/ログファイルを取得するためのcomposer.json
ファイルの例を次に示します:
<code class="language-json">{ "require": { "psr/log": "dev-master" } }</code>
ロギングのコードの再利用を制限する方法
PHPには、それぞれがデータを収集および記録する独自の方法を備えたさまざまなログライブラリがあります。それらにはいくつかの共通点がありますが、各ライブラリには独自のロギング方法のセットがあります。これは、ログを切り替えることは困難な場合があり、多くの場合、ロギングが使用されている場所でコードを変更する必要があることがよくあります。これは、コードの再利用とオブジェクト指向の設計の確固たる原理に反します。私たちが直面している状況は、特定のログライブラリの依存関係を宣言するか、完全に記録することを避けることです。この問題をより明確に説明するには、特定の例が必要です。メールの送信を処理するシンプルなメーラーオブジェクトを作成しているとします。メールを送信するたびにメーラーにメッセージを記録してもらいたいので、優れたモノログライブラリを使用してロギングのニーズを処理することにしました。
<code class="language-php"><?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }</code>
次のコードでこのクラスを使用できます。
このコードを実行すると、送信された電子メールが録音され、<code class="language-php"><?php // 创建一个Monolog对象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 创建邮件发送器并发送电子邮件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");</code>ファイルに新しいエントリが作成されます。この時点で、再利用可能なメーラーオブジェクトを書いたと思うかもしれません。依存関係の注入を使用して、メーラーでロガーを利用できるようにするため、メーラーコードに触れずに異なるロガー構成を交換できます。確かな原則に成功し、ハード依存関係の作成を避けたようです。ただし、アナログを使用してロギングインタラクションを処理するために、さまざまなプロジェクトでメーラークラスを再利用したいとします。アナログには
メソッドがないため、問題があります。アナログを使用して情報レベルのメッセージを記録するには、mail.log
を呼び出します。以下に示すように、メーラークラスを変更してアナログメソッドを使用できます。 addInfo()
Analog::log($message, Analog::INFO)
<code class="language-json">{ "require": { "psr/log": "dev-master" } }</code>
これは機能しますが、理想とはほど遠いものです。特定のロギングの実装に対するメーラーの依存に遭遇しました。これには、新しいロガーを導入するときにクラスを変更する必要があります。これにより、クラスの再利用性が低下し、特定のロガーの可用性に依存するか、クラスのログを完全に放棄するかどうかを選択する必要があります。
PSR-3を使用して、ロガーの依存関係を避けます
アレハンドロ・ゲルヴァシオがトピックに関する彼の優れた記事で説明しているように、依存関係の反転の原則は、具体的な実装ではなく抽象化に依存するべきだと言っています。ロギングの場合、私たちの現在の問題は、依存できる適切な抽象化の欠如です。これは、PSR-3が登場する場所です。 PSR-3は、ロガーに共通のインターフェイスを提供することにより、ロギング実装の非互換性を克服するように設計されています(適切に指名されたLoggerInterface
)。特定の実装に縛られていないインターフェイスを提供することにより、PSR-3を使用すると、特定のロガーに依存することを避けることができます。代わりに、
<code class="language-php"><?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }</code>コンストラクターは
実装者を受け入れるように変更されており、sendEmail()
メソッドが呼び出されました。 MonologはすでにPSR-3に準拠しており、アナログはinfo()
を実装するラッパーオブジェクトを提供するため、メーラークラスを変更せずにこれら2つのロガーを使用できるようになりました。モノログを使用してこのクラスを呼び出す方法は次のとおりです。
LoggerInterface
<code class="language-php"><?php // 创建一个Monolog对象 $logger = new Monolog\Logger("Mail"); $logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log")); // 创建邮件发送器并发送电子邮件 $mailer = new Email\Mailer($logger); $mailer->sendEmail("email@example.com");</code>を使用します
メーラークラスを編集したり、使用方法を変更せずに、ライブラリでメーラーオブジェクトを使用することができます。
<code class="language-php"><?php namespace Email; class Mailer { public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 Analog::log("Email sent to $emailAddress", Analog::INFO); } }</code>PSR-3 これまでのところ、を要求する実装者を介して、特定のロギングの実装からメーラーオブジェクトを正常に分離しました。しかし、PSR-3サポートのためにまだ追加されていないロガーについてはどうでしょうか?たとえば、人気のあるKloggerライブラリはしばらく更新されておらず、現在PSR-3と互換性がありません。幸いなことに、アダプターパターンを活用することにより、Kloggerによって公開されたメソッドをで定義されたメソッドに簡単にマッピングできます。 PSR/Logリポジトリでサポートされているファイルを使用すると、拡張できるクラスを提供することにより、アダプタークラスを簡単に作成できます。抽象クラスは、
で定義された8つのレベル固有のログメソッドを一般的なLoggerInterface
メソッドに転送するだけです。 LoggerInterface
クラスを拡張し、独自のAbstractLogger
メソッドを定義することにより、PSR-3をネイティブにサポートしていないロガー用のPSR-3準拠のアダプターを簡単に作成できます。 Klogger用のシンプルなアダプターを作成して、これを以下に示します:LoggerInterface
<code class="language-json">{ "require": { "psr/log": "dev-master" } }</code>
log()
メソッドは、単にLoggerInterface
メソッドをそれぞれのKloggerメソッドにマップするだけで、Kloggerは実際のロギングアクティビティを処理します。この方法でKloggerクラスをラッピングすることにより、LoggerInterface
契約を破らずに使用できます。これで、メーラークラスでKloggerアダプターを使用できます。
<code class="language-php"><?php namespace Email; class Mailer { private $logger; public function __construct($logger) { $this->logger = $logger; } public function sendEmail($emailAddress) { // 发送电子邮件的代码... // 记录消息 $this->logger->addInfo("Email sent to $emailAddress"); } }</code>Adapterクラスを使用すると、メーラークラスを変更せずにKloggerを使用しても、
に付着することができます。 Kloggerはデバッグレベルメッセージの2番目のパラメーターを受け入れないため、アダプターを使用してもPSR-3に完全に準拠していません。 Kloggerを拡張してPSR-3と完全に互換性のあるものにすることは些細な作業ですが、それはこの記事の範囲を超えています。ただし、アダプタークラスを使用すると、完全にPSR-3に準拠することに非常に近づき、KloggerクラスでLoggerInterface
を使用できるようになると言っても安全です。 LoggerInterface
結論 この記事では、PSR-3を使用して、特定のロギングの実装に依存しないロガーフリーコードを作成するのに役立つ方法を学びました。多くの主要なPHPプロジェクトが、Monolog、Symfony、Moustache.phpを含むPSR-3のサポートを追加しており、Drupalのような他の有名なプロジェクトでは、それを最適に統合する方法について議論しています。 PSR-3はコードの再利用の障壁を減らすため、より多くのライブラリとフレームワークがロギングを使用して、開発者に有用な情報を提供する必要があります。 PSR-3は、アプリケーションでのロギングの使用方法に影響しますか?以下のコメントセクションでお知らせください。
(フォトリアからの写真)(スペースの制限のため、PSR-3ロギングのFAQ部分はここで省略されています。必要に応じて追加できます。
以上がPHPマスター|再利用性を向上させるために、PSR-3でロギングしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。