好的,所以我在看NLog。根据用法,我的应用程序将与日志框架绑定。我该如何克服这个问题?
此外,在使用NLog时,我必须为我正在使用此框架的每个类编写太多monkey-code
。制作一个静态类并从我的应用程序中的任何位置访问它是一个好习惯吗?
示例:
//the monkey code
private static Logger logger = LogManager.GetCurrentClassLogger();
//the coupling.
logger.Log(/*...*/);
答案 0 :(得分:7)
创建自己的日志记录界面:
public interface IMyOwnLogger {
void Log(string message);
}
创建实施:
public class NLogLogger : IMyOwnLogger {
void Log(string message) {
StackFrame frame = new StackFrame(1, false);
Logger logger = LogManager.GetLogger(frame.GetMethod().DeclaringType.FullName);
logger.Log(/*...*/);
}
}
将IMyOwnLogger绑定到IOC容器中的NLogLogger。
IOC.Get<IMyOwnLogger>()
)。修改强>
Idsa发表了关于疏忽调用类的评论。请记住,您始终可以使用堆栈跟踪:
var method = (new StackTrace()).GetFrame(1).GetMethod()
从那里提取调用类。
修改强>
这就是NLog中GetCurrentClassLogger
的样子,所以在我们的类中使用StackTrace不会产生额外的开销:
[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
#if SILVERLIGHT
StackFrame frame = new StackTrace().GetFrame(1);
#else
StackFrame frame = new StackFrame(1, false);
#endif
return globalFactory.GetLogger(frame.GetMethod().DeclaringType.FullName);
}
答案 1 :(得分:2)
就个人而言,我通过使用避免将任何日志框架绑定到我的代码 我的代码TraceSource到instrument。然后,我使用日志框架(通常是Enterprise Library的日志记录应用程序块)来“监听”运行时的跟踪输出,并对该信息执行必要的操作。 (即写入数据库,发送电子邮件等)