私のアプリケーション(MVC3 Webアプリケーション)にlog4netを使ってCastle Logging機能を使用しています。しかし、ILoggerインターフェイスを直接使用するのではなく、具体的な実装Log4NetAuditor(下のコードを参照)を使用して別のインターフェイス(IAuditor)を作成して抽象化しました。log4net loggerの名前を設定する
ILoggerのポイントは基本的なロギングの実装を抽象化することなので、なぜこれをやったのか聞いてみることができます。私はすべてのインフラストラクチャの懸念を抽象化するという原則を厳守したために行ってきました。 MyProject.Infrastructure.Log4NetAuditor:すべてのロガーは、同じ名前が付けられてい除き
は今、これはうまく動作します
2011-01-24 13:26:11,746 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Attempting login...
2011-01-24 13:26:11,845 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Authentication result is Authenticated
IAuditorは抽象クラスであるAuditableComponentのプロパティとして公開されてからのすべてのコンポーネントログを取得する必要があります。
public abstract class AuditableComponent
{
private IAuditor _auditor = NullAuditor.Instance;
public IAuditor Auditor
{
get { return _auditor; }
set { _auditor = value; }
}
//....
}
Log4NetAuditorクラスは次のようになります。
今public class Log4NetAuditor : IAuditor
{
private ILogger _logger = NullLogger.Instance;
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public void Trace(string message)
{
_logger.Debug(message);
}
}
すべてのログ・ステートメントは、同じロガー名を持っている理由、それは明らかだ:ILoggerですがLog4NetAuditorクラスに注入されます。
どのようにして、ロガーの名前がAuditableComponentを拡張するクラスの名前に対応するようにすることができますか?
なぜLoggingFacilityを使用していないのですか?それは機能を提供しますOOTB –
こんにちはKrzystof、私はLoggingFacilityを使用しています。しかし、私はクライアントアプリケーションでILogger(つまりWindsor)への参照を望んでいません。それでIAuditorの抽象化が行われます。 –
は、施設の仕組みを見て、それを複製することができます。それはOSSのメイトです - あなたが好きなようにそのコードを使用して修正することができます:) –