2011-10-29 46 views

回答

-1

您可以通過在配置文件中配置您的TextFormatter來獲取方法名稱。我已經包含了整個格式化程序爲您提供了一些上下文,但要查找的關鍵是模板屬性中的{property(MethodName)}。我不知道如何獲得行號。

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General"> 
    <formatters> 
     <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     template="Timestamp: {timestamp}{newline}&#xA;Title: {title}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}&#xA;Type: {property(TypeName)}{newline}&#xA;Method: {property(MethodName)}{newline}&#xA;Parameters: {dictionary({key} : {value};)}{newline}&#xA;Return Value: {property(ReturnValue)}{newline}&#xA;Call Time: {property(CallTime)}{newline}" 
     name="Detailed Text Formatter" /> 
    </formatters> 
</loggingConfiguration> 

Configuring Formatters MSDN文章提到了這些特殊記號但遺憾的是並沒有解釋如何使用它們非常好。

+0

這是錯誤的,並且不起作用。在'{屬性()}格式化用於'對底層LogEntry對象的印刷物的性能如'ActivityId' –

3

你不會說你正在使用哪個版本的EntLib,但給定你的文章的日期,我會假設EntLib 5.0。

你有興趣在格式字符串的部分是:

Extended Properties: {dictionary({key} - {value}{newline})} 

這是如下的配置文件中的總「默認」格式化模板的一部分:

<formatters> 
     <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}" name="Text Formatter" /> 
    </formatters> 

因此,您可以看到擴展屬性是一個字典,在創建日誌條目時將由記錄器自動迭代。它的目的是提供一種快速和骯髒的方式來轉儲您的應用可能提供的額外輸出。更完整的方法是編寫一個自定義的格式化程序,該格式程序專門爲您將添加到擴展屬性中的每個對象創建標記。

要獲得性進入這個集合進行的條目時只使用

LogWriter.Write(..) 

方法的適當的過載。其中一些有

IDictionary(key, string) properties 

您可以用來提供這些值的參數。

至於行號和方法名,這些只能插入到上面提供的字典中。要獲得它們的值,您可以:

private void FillExtraLogInfo(IDictionary<string, object> info) 
    { 
     StackFrame stackFrame = new StackFrame(1, true); 
     info.Add("Method Name", stackFrame.GetMethod().ToString()); 
     info.Add("Line Number" stackFrame.GetFileLineNumber()); 
    } 
+0

值得說得到的StackFrame是非常昂貴的操作和堆棧跟蹤可能是如果使用的是釋放是不正確的在JIT編譯器內聯方法的情況下啓用優化。 – 0b101010

+0

不錯。注意'stackFrame.ToString()'將在一個字符串中提供文件名,方法名和行號。 – AaronLS

相關問題