簡體   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