我一直在尋找一種方法來記錄類名和方法名稱作爲我的日誌記錄基礎結構的一部分。很顯然,我希望在運行時使用起來更快,速度更快。我已經做了很多關於日誌記錄類名和方法名的閱讀,但是我已經運行了兩個主題。使用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