Dot-Net
如何將 NLog 的文件名設置為程序開始日期?
我試過了
<target name="txtFile" xsi:type="File" fileName="${date:format=yyyy-MM-dd HH-mm-ss}.txt" layout="${longdate} ${level} ${message}"/>但它每分鐘創建一個新文件。我意識到有,
${processinfo:property=StartTime}但我無法格式化它。我試過了:${processinfo:property=StartTime:format=yyyy-MM-dd HH-mm-ss}但它不起作用
使用記憶體佈局渲染器
對於不需要程式碼的解決方案,請使用記憶體佈局渲染器:
<target name="txtFile" xsi:type="File" fileName="${cached:cached=true:inner=${date:format=yyyy-MM-dd HH-mm-ss}}.txt" layout="${longdate} ${level} ${message}"/>使用自定義佈局渲染器
上面的解決方案實際上並不使用程序開始時間。相反,它使用第一條日誌消息路由到該目標的時間(例如,第一條日誌到文件)。例如,如果您希望日誌文件駐留在以程序開始時間命名的目錄中,這可能會成為問題。
在這種情況下,可以使用自定義佈局渲染器。將以下類添加到您的項目中:
namespace NLog.LayoutRenderers { using NLog.Config; [LayoutRenderer("processstarttime")] public class ProcessStartTimeLayoutRenderer : DateLayoutRenderer { private Process process; protected override void InitializeLayoutRenderer() { base.InitializeLayoutRenderer(); this.process = Process.GetCurrentProcess(); } protected override void CloseLayoutRenderer() { if (this.process != null) { this.process.Close(); this.process = null; } base.CloseLayoutRenderer(); } protected override void Append(System.Text.StringBuilder builder, LogEventInfo logEvent) { if (this.process != null) { builder.Append(this.process.StartTime.ToString(this.Format, this.Culture)); } } } }並按如下方式使用它:
<target name="txtFile" xsi:type="File" fileName="${processstarttime:format=yyyy-MM-dd HH-mm-ss}.txt" layout="${longdate} ${level} ${message}"/>該解決方案基於Process Info Layout Renderer。