コンテキスト情報 (つまり、${longdate}、${level}、${message}) のリストはオンラインにありますか? ユーザーの AppData\Local フォルダーにログ ファイルを設定したいと考えています。おそらく${appdatalocal}ですか?また、ファイルにアクセスして電子メールの添付ファイルとして送信するにはどうすればよい
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")
でしょうか?
1 に答える
NLog でサポートされている LayoutRenderers のリストについては、このリンクを参照してください。これらのレイアウト レンダラーの一部は、NLog 2.0 (9 月にベータ版としてリリースされたばかり) に追加されていることに注意してください。「特別な」フォルダ (マイ ドキュメント、マイ ミュージックなど) を指定できる LayoutRenderer がいくつかあります。環境変数の値を取得できる LayoutRenderer もあります。LayoutRenderers を使用してファイル名を定義できます。
${basedir}/${shortdate}.log
また
${environment:variable=TEMP}/${processname}.log
結果のファイル名にプログラムでアクセスする限り、その方法はわかりませんが、アイデアはあります...
ファイル名の定義に使用するレイアウトと同じレイアウトで MethodCallTarget を構成できます (上記のリンクのドキュメントを参照してください。または、NLog ヘルプ ファイルを参照してください)。そのターゲットにログを記録する単一のロガー ルールを NLog.config ファイル (インラインで構成する場合は app.config) で定義します。MethodCallTarget によって呼び出される静的メソッド LogMethod を記述します。同じクラスに、文字列を返す別の静的メソッド GetFilename を記述します。GetFilename は、MethodCallTarget に書き込むように構成されたロガーを使用してメッセージをログに記録するだけです。NLog は LogMethod を呼び出します。LogMethod の内部では、完全にフォーマットされたメッセージを受け取ります。レイアウトをファイル名レイアウトと同じになるように構成したため (つまり、ファイル名の計算に必要なパラメーターのみ)、ログに記録されるメッセージの値は、ファイルへのパスである必要があります。LogMethod は静的メソッドでなければならないため (NLog 要件)、「ファイル名」を保存する場所はあまりありません。静的文字列変数を入れただけです。
このようなもの (MethodCallTarget の下の NLog ヘルプ ファイルのサンプルに基づく):
public class Example
{
private static filename;
//
// This is the method that NLog will call when you log with the logger that is configured
// to write to the MethodCallTarget
//
public static void LogMethod(string level, string message)
{
filename = message;
}
public static string GetLogFile()
{
Logger logger = LogManager.GetLogger("filenamelogger");
filenamelogger.Info("logging a message just to get the result");
return filename;
}
}
次のように設定します。
<variable fn="${basedir}/${processname}.log" />
<targets>
<target name="m" xsi:type="MethodCall" className="Example, MethodCall"
methodName="LogMethod">
<parameter layout=${fn} />
</target>
<target name="f" xsi:type="File"
layout="${longdate} ${loggername} ${level} ${message}"
fileName="${fn}">
</target>
</targets>
<rules>
<logger name="filenamelogger" minlevel="Debug" writeTo="m" final="true" />
<logger name="*" minlevel="Debug" writeTo="f" />
</rules>
これは明らかにスレッドセーフではありませんが、レイアウトの結果を取得する方法を示しています。