3

我正在使用Ninject 3.0.1.10 进行依赖注入,并希望将Ninject.Extensions.Logging 3.0.1.0 用于log4net 1.2.11 日志记录。但是,当我使用扩展而不是直接使用 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

我希望第二行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,默认情况下会使用类的完整命名空间/名称组合。

另一种选择是log4net.ILog直接注入并停止使用 Ninject 扩展。

于 2012-06-22T07:08:25.377 回答