web-dev-qa-db-ja.com

ロギングプラットフォームを抽象化するのに適した設計(パターン)はどれですか。

ロギングプラットフォームを抽象化するsimpleシステムを作成する必要があります。アイデアは、some設定(これにより、ロギングプラットフォーム(nlog、_log4net_、_enterprise library_))を交換またはアクティブ化できるようにしたいということです。問題ではないはずです)。サポートしたいプラットフォームごとにwrapperが必要で、必要なdllをロードしてロガーを作成することを知っています。

LogDebugTraceなどの最も一般的なメソッドを提供する抽象クラスまたはインターフェースを作成することを考えていました。

_interface ILogger
{
    void Log(...);
    void Debug(...);
    // etc.
}

class NLogPlatform : ILogger
{
    // create nlog, load config etc.
}

class Log4NetPlatform : ILogger
{
    // create log4net, load config etc.
}

class LoggerFactory
{ 
    public static CreateLogger(...)
    {
        // read settings and create a logger.
    }
}
_

最初はログプロバイダーについて考えていましたが、プロバイダーがパターンではないことに気づいたので 。NET Design Patterns を調べましたが、実際には適切なものは何もありません。私は何かを逃したのですか、それともパターンがないのですか?

今回は最初からright方向に移動し、後でいくつかのツールをリファクタリングしたいので、まだ実際に開始していません。

そのようなシステムを設計する際に何を考慮すべきか、そしてそのためのパターンがあるかどうかを教えてもらえますか?

6
t3chb0t

おめでとうございます。オブジェクトアダプタパターンを(再)発見しました。 1つのターゲットインターフェイス(ここではILogger)とさまざまなアダプタクラスNLogPlatformLog4NetPlatform、…。各アダプタークラスはターゲットインターフェイスに準拠し、メンバーとして含まれているアダプターオブジェクトへのすべての呼び出しをプロキシします。

このパターンをより明確に使用したい場合は、アダプタクラスNLogAdapterなどを呼び出します。

正しいログアダプターを挿入するためのファクトリーの使用は、これと完全に直交しており、依存関係の逆転の原則についてです。

6
amon
  1. これはデザインパターンとは関係ありません...

  2. これは解決された問題であり、.Netが発明されて以来、何度も解決されてきました。

  3. Commons.Loggingを使用するだけです。これは、構成された小さなリベラリティであり、要求したとおりに機能します。 https://github.com/net-commons/common-logging

3
AK_