ここで同様の質問に対する私の回答を参照してください。
Nlog - ログ ファイルのヘッダー セクションの生成
要約すると、別のロギング ターゲットを定義することを提案します。ファイルにログを記録している場合は、2 番目のファイル ターゲットを定義して、同じファイルを指すが、レイアウトが異なります。必要な形式になるようにレイアウトを定義します。レイアウトを定義して、必要なヘッダー値 (この場合は "---------------") にハードコードするか、メッセージとログのみを記録するようにレイアウトを定義できます。次に、レイアウトをそれに渡すことができます。
これが機能する可能性のある最短のものです。上記のリンクの回答から切り取り、貼り付け、ケースに合わせてわずかに変更したことに注意してください。私はそれをテストしませんでした。
レイアウトを定義します。
<variable name="HeaderLayout" value="${message}"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />
レイアウトを使用してターゲットを定義します。
<target name="fileHeader" xsi:type="File" fileName="xxx.log" layout="${HeaderLayout}" />
<target name="file" xsi:type="File" fileName="xxx.log" layout="${InfoLayout}" />
ルール/ロガーを定義します。
<rules>
<logger name="headerlogger" minlevel="Trace" writeTo="fileHeader" final="true" />
<logger name="*" minlevel="Trace" writeTo="file" />
</rules>
ロガーを使用します。
public class MyClass
{
private static Logger logger = LogManager.GetCurrentClassLogger();
private static Logger headerLogger = LogManager.GetLogger("headerlogger");
public void DoSomething()
{
headerLogger.Info("---------------------");
logger.Info("Inside DoSomething");
headerLogger.Info("---------------------");
}
}
または、ヘッダー定義が含まれるようにレイアウトを定義することもできます。
<variable name="HeaderLayout" value="-----------------------------"/>
<variable name="FileLayout" value="${longdate} | ${logger} | ${level} | ${message}" />
次に、次のように使用します。
Logger headerLogger = LogManager.GetLogger("headerlogger"); //Assuming same rules/loggers definition as above.
headerLogger.Info("It doesn't matter what you put here because the layout has the header message hardcoded");
ヘッダーロガーを明示的に処理する必要がないように、ヘルパー関数を作成できます。
public void WriteHeader()
{
LogManager.GetLogger("headerlogger").Info("This string does not matter");
}
これにより、自分がやろうとしていることをどのように達成できるかについての良い洞察が得られるはずだと思います.
お役に立てれば!
幸運を!