使用NLog自定义日期格式

时间:2015-03-23 23:35:55

标签: nlog

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

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

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

我宁愿定义一个可以执行此操作的变量,而不是将其插入到多个应用程序的所有配置中,例如:

{ourdate}

我有一个黑客,但我不知道如何做到这一点。有可能吗?

由于

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

2 个答案:

答案 0 :(得分:2)

最简单的事情可能就是咬住子弹并使用常规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}
祝你好运!

答案 1 :(得分:2)

使用$ {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的结果字符串的模式的自定义日期和时间格式字符串。