0

私はインターフェースを持っています

public interface ILoggerService
{
    void Info(string message);
    void Warn(string message);
}

次に、このインターフェイスを実装し、Log4Netを使用してログを記録するクラスがあります

public class Log4NetLoggerService : ILoggerService
{
    private readonly ILog _logger;
    public Log4NetLoggerService()
    {
        // this always returns Log4NetLoggerService class type
        _logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    }

    public void Info(string message)
    {
        _logger.Info(message);
    }
}

これは正常に機能しますが、問題は、現在のクラスとメソッド名を(%class-%Mを使用して)ログに記録する場合、これは常にLog4NetLoggerServiceクラスとして返され、メソッドとしてはメソッドとして返さInfoれることです。

loggingメソッドを呼び出す「親」クラスタイプを取得する必要があります。

ILoggerServiceインスタンスを作成するときにlogメソッドを呼び出すクラスのタイプをなんとかして注入できますか?

4

2 に答える 2

1

log4netのソースコードを見てください。具体的には、ILogインターフェイスをどのように実装したか。基本的に、ラッパーでILogインターフェースを使用することはできません。代わりに、呼び出しスタックで正しいクラス/メソッドを探す場所をlog4netに指示するパラメーターを受け入れる内部ロガーを使用します。この回答も参照してください。

于 2013-03-12T11:01:04.117 に答える
1

私の経験では、ログインしているクラスの名前が必要な場合は、おそらくアプリケーション内のあまりにも多くの場所からログインしすぎています。これにより、メンテナンスの問題が発生する可能性があります。この Stackoverflow の回答を見て、ログを取りすぎていないか、SOLID の原則に違反していないかを確認してください。

于 2013-03-12T19:17:19.633 に答える