ロギングに適した設計パターンはどれですか?


10

プログラム内のいくつかのイベントをログに記録する必要がありますが、プログラムの実際の機能に関するものではないため、ログコードをプログラムの外部に置いた方がよいでしょう。それで、コードから完全に除外し、オブザーバーとリスナーのみを使用してイベントをログに記録する必要があるかどうかを教えてもらえますか?または、何かをログに記録する必要がある場合はいつでも、次のようなコード行を追加できます。

MyGloriousLogger.getXXXLogger().Log(LogPlace, new LogObject(z1, z2, z3, z4, ..., z99));

Observer設計パターンを使用するのは間違いですか?別のデザインパターンが必要ですか?または私はデザインパターンについて考えるのをやめるべきですか?

PS1。リスナーとオブザーバーのみを使用してログを記録したい場合は、プログラムのオブザーバーとリスナーを追加して改善する必要があります。

PS2。Javaにログインするためのさまざまなライブラリがあり、java.utils.loggingを使用していることは確かですが、特別なオブジェクトをログに記録するためのラッパーが必要です。


2
Javaにはすでに17のロギングフレームワークとメタロギングフレームワーク(slf4j)があり、おそらくいくつかのメタメタロギングフレームワークがあり、どれも機能しませんか?
kevin cline 2014

回答:


15

Logging通常、責任連鎖パターンで実装されます。もちろん、それをFacadeと組み合わせることができます(私もそうします)。私は実際には自分でリスナーやオブザーバーを使用しません。

責任の連鎖-ロガー


これは基本的に「コードで抽象的なロガーに書き込む」と言っていますか?私の質問は、ログを記録したい場所からイベントをトリガーし、イベントに応答してログを記録するリスナーを提供する必要があるか、またはLoggerサービス(内部的に責任の連鎖を使用する)を直接呼び出す必要があるかどうかです。
Fire-Dragon-DoL 2017


0

まあ、オブザーバーは私には不向きに聞こえます。また、ロガー呼び出しを「必要な場所に」投げると、コードが破壊され、SRPに違反します。

たとえば、このためにAOPに興味があるかもしれないので、メソッドアノテーションを介してロガー呼び出しをアタッチできます。


0

出力が複数の場所に到達する可能性がある場合、責任の連鎖は良いパターンのようです。UMLには、コンソール、errorFile、および3番目の単純な情報ロガーを対象とする別のロガーがあります。

通常、logLevelsは異なりますが、ロギングファイルは同じです。

ロギングコードがアプリケーションコードから切り離されているため、オブザーバーパターンはロギングに適しているとは言えません。これは良い方法です。別のロギングメカニズムへの移行はこの方法で簡単です。ログを記録するたびにイベントを発生させ、適切なリスナーがイベントを受信して​​ログに記録します。すべてのレジスタのリストを保持する中間のシングルトンオブジェクトが必要です。

このようにして、ロギングコードをアプリケーションコードから分離できることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.