我试过了

<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}

但这不起作用

最佳答案

使用缓存的布局渲染器

对于不需要代码的解决方案,请使用Cached Layout Renderer:

<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

10-08 04:43