2011-10-29 7 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

これは間違っていて動作しません。 'ActivityId'のような基になるLogEntryオブジェクトのオブジェクトプロパティを出力するために' {property()} 'フォーマッタが使われます –

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()'は、ファイル名、メソッド名、行番号を1つの文字列で提供します。 – AaronLS

関連する問題