使用 NLog 自定义日期格式

Custom date format with NLog

在我看来,NLog 中的内置日期格式没有正确包含时区。我们需要用尾随 Z 记录 UTC 时间,以便 Splunk 知道当地时间是什么,例如:

{日期:universalTime=true:format=yyyy-MM-dd HH:mm:ss.ffffZ}

这会生成我们需要的正确日期。

与其将它插入到我们跨多个应用程序的所有配置中,我更愿意定义一个变量来执行此操作,例如:

{我们的日期}

我有一些技巧,但我不知道该怎么做。可能吗?

谢谢

PS。 {longdate} 确实包括时区,但它会减少毫秒数。

对您来说最简单的事情可能就是硬着头皮使用常规的 NLog DateLayoutRenderer 并在每个配置文件中指定配置值。如果您希望保持配置文件简单,您可以编写自己的日期 LayoutRenderer 以特定格式生成日期。

这是一个粗略的实现(未测试)。它将始终以您在上面指定的格式记录日期。我基于 NLog 的 DateLayoutRenderer,您可以在这里找到它的来源:

https://github.com/NLog/NLog/tree/master/src/NLog/LayoutRenderers

您实际上并不需要更多选项,因为您可以使用内置的 DateLayoutRenderer 轻松实现所需的格式。此实现只是为您节省了 NLog.config 个文件的工作量。

namespace NLog.LayoutRenderers
{
    using System.ComponentModel;
    using System.Text;
    using NLog.Config;

    /// <summary>
    /// Current date and time.
    /// </summary>
    [LayoutRenderer("utczdate")]
    [ThreadAgnostic]
    public class UTCZDateLayoutRenderer : LayoutRenderer
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="UTCZDateLayoutRenderer" /> class.
        /// </summary>
        public UTCZDateLayoutRenderer()
        {
        }

        /// <summary>
        /// Renders the current date and appends it to the specified <see cref="StringBuilder" />.
        /// </summary>
        /// <param name="builder">The <see cref="StringBuilder"/> to append the rendered data to.</param>
        /// <param name="logEvent">Logging event.</param>
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            var ts = logEvent.TimeStamp;
            builder.Append(ts.ToString("yyyy-MM-dd HH:mm:ss.ffffZ", CultureInfo.InvariantCulture));
        }
    }
}

您可以像这样在 NLog.config 文件中使用它:

{utczdate}

祝你好运!

使用 ${date:universalTime=true:format=o}

格式 2015-11-06T14:24:52.4025753Z ISO 8601

You are wanting the Round-Trip ("O","o") Format Specifier

"O" 或 "o" 标准格式说明符表示使用保留时区信息并发出符合 ISO 8601 的结果字符串的模式的自定义日期和时间格式字符串。