繁体   English   中英

从类库访问日志记录功能

[英]Accessing logging functionality from a class library

我有一个包含两个项目的解决方案,我的WPF应用程序项目引用了第二个项目,一个类库。 WPF应用程序使用Caliburn.Micro。 我想库中的一些类通过Caliburn.Micro的日志工具(我用log4net设置,但这应该是无关紧要的)记录消息。

为了查看这是否有效,我将以下类放入我的库中,以查看是否有任何内容会显示在我的日志中,并从我的一个视图模型中调用它:

public class TempClass {
    private static ILog Log = LogManager.GetLog(typeof(TempClass));

    public static void LogSomething(string something) {
        Log.Info(something);
    }
}

它没用。

类库无法引用我的WPF应用程序的项目,因为这会导致循环引用。

什么是这个问题的好方法?

编辑

一些可能有用的附加信息。 LogManager是Caliburn.Micro.DLL中的静态类,并具有公共静态GetLog字段:

public static Func<Type, ILog> GetLog = type => NullLogInstance;

在我的引导程序中,我正在设置它

LogManager.GetLog = type => new Log4netLogger(type);

如果我在Log4netLogger构造函数中设置断点,则在调用GetLog()以在TempClass中获取我的ILog实例时不会触发它。

如果有帮助,这是Log4netLogger的实现:

internal class Log4netLogger : ILog {
    private readonly log4net.ILog InnerLogger;

    public Log4netLogger(Type type) {
        InnerLogger = log4net.LogManager.GetLogger(type);
    }

    public void Error(Exception exception) {
        InnerLogger.Error(exception.Message, exception);
    }

    public void Info(string format, params object[] args) {
        InnerLogger.InfoFormat(format, args);
    }

    public void Warn(string format, params object[] args) {
        InnerLogger.WarnFormat(format, args);
    }
}

事实证明问题是使用字段初始化程序。 我相信这是在我的引导程序有机会将另一个委托分配给GetLog之前调用的。 以下是新的TempClass:

public class TempClass {
    private static ILog Log;

    public static void LogSomething(string something) {
        if (Log == null)
            Log = LogManager.GetLog(typeof(TempClass));

        Log.Info(something);
    }
}

您可以使用依赖注入来解决此问题: http//msdn.microsoft.com/en-us/library/aa973811.aspx

(你也可以使用ServiceLocator: http//www.martinfowler.com/articles/injection.html虽然,你会发现它的意见不一。有些人喜欢它,有人说服务定位器是邪恶的: http:// blog .ploeh.dk / 2010/02/03 / ServiceLocatorisanAnti点模式/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM