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