2012-03-09 44 views
2

My appはアプリケーション自体のログを作成するので、アクティブになったときとアプリケーションレベルで何が起こったのかを記録します。NLog Configuration API:変数に格納されたレイアウトを使用する

アプリケーションは「プロファイル」を中心にしています。ユーザーは、アプリケーションに/ when/what/howがどこにあるかを示すプロファイルを読み込みます。だから私はまた、プロファイルが実行されるたびに進捗状況を記録するために、各プロファイルのログを作成したいと思っています。

プロファイルログをプロファイル自体と一緒に保存したいので、NLogを動的に設定する必要があるため、実行時にfileTargetパスを指定する必要があります。

しかし、私はNLog.configの変数として、使いたい標準レイアウトを保存したいと思っていました。これは私が読んだことから一般的なアプローチであるようです。

ただし、次の行

fileTarget.Layout = "${myLayout}" 

で...私はArgumentExceptionが取得:現時点では

LayoutRenderer cannot be found: 'myLayout' 

を、私のレイアウト変数は単純です:

<variable name="myLayout" value="${message}" /> 

です変数を使用してAPIを介してレイアウトを指定することはできません。そうであれば私は驚くだろう。あるいは私はどこかで間違ってしまった?

解決策は簡単です。私はfileTarget.Layoutに手動で指定されたレイアウトを設定できますが、Plan Aが機能するかどうかはわかりません。

答えて

2

主にNLogが<variable>要素にアクセスするためのAPIを公開していないため、NLogのサイトからコンパイルされたバイナリを使用している場合は不可能です。

あなたはこの能力を追加することを提案することができます。または、あなたがこの能力を持つことに熱心であれば、ソースコードをダウンロードして変更することができます。ファイルXmlLoggingConfiguration.csprivate string ExpandVariables(string input)が公開する必要があります。

幸運。

+0

Meh ...ソースコードを変更するか、アプリケーションの設定ファイルにレイアウトを保存するだけですか?タイムスケールが与えられれば、それは思いがけないことです! :)しかし、応答に感謝します。 – CJM

+0

もし私があなただったら私は同じ選択をしていたでしょう(私の返事を似たようなもの[ここ]で見てください(http://stackoverflow.com/questions/9523875/how-to-set-nlogs-filename-to-the-process -start-date/9524600#9524600))。 – AVIDeveloper

+0

この回答は正確ではありません。下の私の答えを見てください。 – MarkR

5

私は最新のソースコード(NLog 3.2.0.0)を入手し、NLogに変更を加えることなくサポートされているソリューションを見つけました。以下のコードは、変数の値を取得します。私はそれも書くことができますが、私はその機能が必要ないので、私はそれを試みていないと仮定します。それが質問に答えます。最後の行は変数のテキストを評価し、変数に含まれるレイアウトレンダラーをレンダリングします。

var config = (NLog.Config.XmlLoggingConfiguration)LogManager.Configuration; 
string dir = config.Variables["logDirectory"]; 
dir = NLog.Layouts.SimpleLayout.Evaluate(dir); 
関連する問題