gpt4 book ai didi

c# - 从类库访问日志记录功能

转载 作者:行者123 更新时间:2023-11-30 15:32:46 26 4
gpt4 key购买 nike

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

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

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 中的一个静态类,并且有一个公共(public)静态 GetLog 字段:

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

在我的 Bootstrap 中,我将其设置为

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);
}
}

最佳答案

事实证明问题出在使用字段初始值设定项。我相信这是在我的 Bootstrap 有机会将另一个委托(delegate)分配给 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);
}
}

关于c# - 从类库访问日志记录功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com