我一直在寻找一种方法来记录类名和方法名称作为我的日志记录基础结构的一部分。很显然,我希望在运行时使用起来更快,速度更快。我已经做了很多关于日志记录类名和方法名的阅读,但是我已经运行了两个主题。使用log4net为.NET项目记录ClassName和MethodName
- 该log4net使用内部抛出异常来生成一个堆栈帧,并且如果您通常用于所有日志记录将花费昂贵。
- 混乱。那里有很多文献。我试过了一堆,没有得到一些有用的东西。
如果你幽默我一秒钟,我想重置。
我创造了这样一类在我的项目
public static class Log {
private static Dictionary<Type, ILog> _loggers = new Dictionary<Type, ILog>();
private static bool _logInitialized = false;
private static object _lock = new object();
public static string SerializeException(Exception e) {
return SerializeException(e, string.Empty);
}
private static string SerializeException(Exception e, string exceptionMessage) {
if (e == null) return string.Empty;
exceptionMessage = string.Format(
"{0}{1}{2}\n{3}",
exceptionMessage,
(exceptionMessage == string.Empty) ? string.Empty : "\n\n",
e.Message,
e.StackTrace);
if (e.InnerException != null)
exceptionMessage = SerializeException(e.InnerException, exceptionMessage);
return exceptionMessage;
}
private static ILog getLogger(Type source) {
lock (_lock) {
if (_loggers.ContainsKey(source)) {
return _loggers[source];
}
ILog logger = log4net.LogManager.GetLogger(source);
_loggers.Add(source, logger);
return logger;
}
}
public static void Debug(object source, object message) {
Debug(source.GetType(), message);
}
public static void Debug(Type source, object message) {
getLogger(source).Debug(message);
}
public static void Info(object source, object message) {
Info(source.GetType(), message);
}
public static void Info(Type source, object message) {
getLogger(source).Info(message);
}
...
private static void initialize() {
XmlConfigurator.Configure();
}
public static void EnsureInitialized() {
if (!_logInitialized) {
initialize();
_logInitialized = true;
}
}
}
(如果这个代码看起来很熟悉,那是因为它是从实例借来的!)
无论如何,在我的整个项目中,我都使用这样的线条来记录:
Log.Info(typeof(Program).Name, "System Start");
嗯,这种作品。最重要的是,我得到了类名,但没有方法名。更重要的是,我用这种“类型”的垃圾污染了我的代码。如果我在文件之间复制和粘贴一段代码等等,日志框架就会说谎!
我试着玩PatternLayout(%C {1}。{M}),但没有奏效(它所做的只是将“Log.Info”写入日志 - 因为一切都是通过Log .X静态方法!)。此外,这应该是缓慢的。
那么,考虑到我的设置和我希望变得简单和快速,最好的方法是什么?
提前感谢任何帮助。
需要注意的是,根据这个链接(http://msdn.microsoft .com/en-us/library/system.diagnostics.stacktrace.aspx),.NET中的StackTrace确实需要UnmanagedCode权限。但是,根据此链接,()Silverlight中的StackTrace不具有相同的限制。我的观点是,如果NLog与Silverlight兼容(如即将发布的2.0版本),GetCurrentClassLogger可能在Silverlight中工作得很好(如果正确实施)。正如Joe指出的那样,在“常规”.NET或.NET客户端配置文件中,您确实可以运行UnmanagedCode限制。 – wageoghe 2010-09-23 19:03:45
错过了粘贴上面的第二个链接:.NET中的StackTrace(http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stacktrace.aspx)Silverlight中的StackTrace(http://msdn.microsoft.com /en-us/library/system.diagnostics.stacktrace(VS.95).aspx) – wageoghe 2010-09-23 19:09:53