3

依存性注入にNinject 3.0.1.10 を使用しており、log4net 1.2.11 ロギングにNinject.Extensions.Logging 3.0.1.0 を使用したいと考えています。ただし、log4net を直接使用するのではなく、拡張機能を使用すると、ログ ファイルに異なる出力が表示されます。app.config で次のように、ログを記録するクラス/メソッドの名前を出力に含めたい:

<log4net>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="MyConsoleAppender" />
    </root>

    <appender name="MyConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %-5level %C{1}.%M():%L - %m%n" />
        </layout>
    </appender>
</log4net>

次のように、私が見ている問題を示すサンプルプロジェクトを作成しました。

public class LoggingWithLog4Net
{
    private readonly ILog log;

    public LoggingWithLog4Net(ILog log)
    {
        this.log = log;
    }

    public void LogMessage(string message)
    {
        log.Debug(message);
    }
}

public class LoggingWithNinject
{
    private readonly ILogger log;

    public LoggingWithNinject(ILogger log)
    {
        this.log = log;
    }

    public void LogMessage(string message)
    {
        log.Debug(message);
    }
}

public class Program
{
    static void Main(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        NinjectSettings settings = new NinjectSettings()
        {
            LoadExtensions = false
        };

        using (IKernel kernel = new StandardKernel(settings, new Log4NetModule()))
        {
            kernel.Bind<ILog>()
                .ToConstant(LogManager.GetLogger("*"));

            LoggingWithLog4Net l4n = kernel.Get<LoggingWithLog4Net>();
            LoggingWithNinject ninject = kernel.Get<LoggingWithNinject>();

            l4n.LogMessage("log4net message");
            ninject.LogMessage("ninject message");
        }
    }
}

これにより、次の出力が生成されます (Ninject バージョンのクラス/メソッド名が正しくないことに注意してください)。

2012-06-21 08:25:19,000 DEBUG LoggingWithLog4Net.LogMessage():21 - log4net message
2012-06-21 08:25:19,015 DEBUG Log4NetLogger.Debug():98 - ninject message

2行目にソースクラス/メソッドがあると予想されますLoggingWithNinject.LogMessage():21が、代わりにNinjectLog4NetLoggerがソースとして使用されます。ソースを適切に特定するにはどうすればよいですか?

4

1 に答える 1

0

私が望んでいることは不可能のようです。構成の%C{1}.%M():%L一部により、log4net は呼び出し元クラスの位置情報を出力します。log4net バージョンでは、呼び出しLog4NetLoggerて、その呼び出しを log4net に渡します。これは、ソースが常にLog4NetLogger.

妥協案として、以下を使用しました。

<conversionPattern value="%date [%thread] %-5level %c - %m%n" />

これにより、呼び出しのメソッド名と行番号が失われますが、Ninject 拡張機能を使用すると、正しいクラス名が得られます。Typeこれは、デフォルトでクラスの完全な名前空間/名前の組み合わせに対してロガーが常に要求されるためです。

もう 1 つの方法は、log4net.ILog直接注入して Ninject 拡張機能の使用を停止することです。

于 2012-06-22T07:08:25.377 に答える