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

但它不起作用

最佳答案

使用缓存布局渲染器

对于不需要代码的解决方案,请使用 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 .

https://stackoverflow.com/questions/9523875/

相关文章:

javascript - 有没有办法使用 Moment.js 解析相对日期?

eclipse - 在 Eclipse 格式化程序中的花括号上强制 "same line"

formatting - 是否可以使 PHP 错误看起来更好? Stack 可以在单独的行上跟踪输出

python - 在 Python 中将浮点列表转换为字符串

javascript - 谷歌图表显示金钱而​​不是百分比

python - 如何用不同的表达式格式化原始字符串?

java - 如何在 Netbeans 中配置 Java 导入的组织

django - 如何格式化 django 评论的表单字段?

c++ - 在不改变缩进的情况下重新格式化 C++ 大括号?

c# - 格式异常 - 日期时间和小时