コードの任意の部分から呼び出すことができる標準インターフェイスを実装する独自の Logging クラスを (C# で) 作成したいと考えています。
私の考えは、複数の Log クラスに Logger インターフェースを実装させ、それぞれが特定のログの宛先に対応するようにすることです。データベーステーブルなどへのロギングを実装します。
さらに、各ロガー クラスは、ネストされたロガー クラスまたはチェーンされたロガー クラスを持つことができるため、アプリケーション コードから Log() メソッドを 1 回呼び出すだけで、メッセージを複数の宛先に記録できます。1 回の呼び出しでフォームのファイルとテキスト ボックスにログを記録します。
私が直面している困難はこれです:
通常、実行中のログ ファイル (デバッグに必要なすべてのログ メッセージが含まれます)、レビュー ログ ファイル (ユーザーが確認するログ メッセージ、またはユーザーの操作が必要なログ メッセージのみが含まれます)、複数行のテキスト ボックスにログを記録します。画面 (すべてのログ メッセージを複製してユーザーに進行状況を示す) と、別の複数行テキスト ボックス (ユーザーが確認する必要があるメッセージのみをログに記録する) です。
logger.Log(message) を呼び出すと、一部のメッセージが特定のログの宛先に適用されない場合があります。たとえば、一部のメッセージは、実行中のログ ファイルまたは進行状況のテキスト ボックスにのみ記録され、ユーザー レビューのテキスト ボックスには記録されないことがあります。その逆も同様です。
1 つの関数呼び出しで必要なすべての宛先にログインできるようにロガーが連鎖されるため、特定のロガーは、ログ メッセージが自分宛てのものではないことをどのように識別し、ログ メッセージを無視できるでしょうか?
サンプル ログ インターフェイスは次のとおりです。
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public void AddLogger(Logger chainedLogger);
public void RemoveLogger(Logger chainedLogger);
}
public class FileLogger : Logger
{
//implement methods
}
public class TextBoxLogger : Logger
{
//implement methods
}
public class DBLogger : Logger
{
//implement methods
}
編集1:
より正確には、2 つのファイル ロガーと 2 つのテキストボックス ロガーの 4 つのロガーが存在する可能性があります。特定のメッセージは、1 つのテキストボックス ロガーと 1 つのファイル ロガーを対象としていると想定されます。私のデザインはこれをどのように処理する必要がありますか?
編集 2: 既存のロギング フレームワークを提案しないでください。自分で書きたい!
編集3:わかりました。私はデザインを持っています。フィードバックをお寄せください。おそらくギャップを埋めてください。
改訂されたインターフェース:
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void Log(int loggerIds, string msg);
public void Log(int loggerIds, string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public int getLoggerId();
}
public enum LoggerType
{
File,
TextBox
};
public class LoggerFactory
{
public Logger getLogger(LoggerType loggerType)
{
}
}
LoggerFactory クラスは、ロガーをインスタンス化する唯一の方法です。このクラスは、ロガーの各インスタンスに一意の ID を割り当てます。この一意の ID は 2 の累乗になります。たとえば、1 番目のロガーは ID 1 を取得し、2 番目は ID 2 を取得し、3 番目は 4 を取得し、4 番目は 8 を取得します。
返されたロガー オブジェクトを特定のクラスに型キャストすることができ、さらに filePath や textbox などの値を呼び出し元が設定することもできます。または、LoggerFactory に複数のメソッドを設定することもできます。特定のパラメーターを受け入れるロガーの型ごとに 1 つです。 .
したがって、ID が 1、2、4、8 の 4 つのロガーがあるとします。1 番目と 3 番目のロガー (つまり、ロガー ID 1 と 4) で処理する必要がある特定のメッセージは、次の関数を使用してログに記録する必要があります。
public void Log(int loggerIds, string msg);
loggerIds に渡す値は「0101」にする必要があります。各ロガーは、ロガー ID ビットがオンであるかどうかをチェックします。はいの場合のみ、メッセージがログに記録されます。
関数シグネチャで int 型について言及しましたが、ビット操作と比較を実行するために最適化された特定の型はどれですか?
このアプローチでは、おそらく最大数に制限がある可能性があります。ロガーの、しかしそれは私には問題ありません。フィードバックをお寄せください。
注: 現在、私はまだ .NET 2.0 を使用しています。可能であれば、.NET 2.0 内での解決策を提案してください。それ以外の場合は、より高いバージョンに移行できます。
この設計の短所: ログを記録する必要がある各クラスは、アプリケーションによってインスタンス化された使用可能なすべてのロガーを認識し、それに応じてビット パターンを設定する必要があります。疎結合設計のアイデアはありますか?