Dot-Net

如何將 NLog 的文件名設置為程序開始日期?

  • August 14, 2018

我試過了

<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

引用自:https://stackoverflow.com/questions/9523875