Problem

NLogは動的にファイル名を設定する機能があります。
ここでは、ファイルパスを設定するプレースホルダーを解析するのではなく、独自のプレースホルダーを設定し、そのプレースホルダーに任意のテキストを設定する方法でファイル名を変更します。

Solution

まずは、NLog.configを変更します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target
name="LogFile"
xsi:type="File"
layout="${longdate} [${uppercase:${level:padding=-5}}] ${message} ${exception:format=tostring}"
fileName="${basedir}Logs\${var:runtime}\${date:format=yyyyMMdd}.log"
encoding="UTF-8"
archiveFileName="${basedir}Logs\archives\${var:runtime}\archive.{#}.log"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="7"
header="[Start Logging]"
footer="[End Logging]${newline}" />
</targets>

<rules>
<logger name="Log" minlevel="Trace" writeTo="LogFile" />
</rules>
</nlog>

上記の ${var:runtime} に注目です。
ここが、プログラム実行中に変化する部分です。runtime の部分は任意の文字列を設定できます。
次に、ソース部分
です。

1
2
3
var logger = LogManager.GetLogger("Log");
logger.Factory.Configuration.Variables.Add("runtime", "test");
logger.Factory.ReconfigExistingLoggers();

Variablesプロパティに、先ほどの runtime をキーにして、任意の値を設定しています。
そして、設定を反映させるために、ReconfigExistingLoggers メソッドを呼び出しています。

以上で、出力先の実際のパスが 実行フォルダのパス\Logs\test\yyyyMMdd.log というログとして解釈されるようになります。