在我看来,在NLog中内置的日期格式没有正确地包含时区。我们需要用尾随Z记录UTC时间,以便Splunk知道当地时间是什么,例如:
{日期:通用时间=真:format=yyyy dd HH:mm:ss.ffffZ}
这产生了我们需要的正确日期。
与其在多个应用程序中插入这些内容,不如定义一个变量来实现这一点,例如:
{我们的}
我周围有黑客,但我想不出该怎么做。有可能吗?
谢谢
PS。{longdate}确实包括时区,但它降低了毫秒。
发布于 2015-03-24 17:47:11
对于您来说,最简单的事情可能只是咬紧牙关,使用常规的NLog DateLayoutRenderer,并在每个配置文件中指定配置值。如果您想保持配置文件的简单性,可以编写您自己的date 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}
祝好运!
发布于 2015-11-06 14:23:29
使用${date:universalTime=true:format=o}
格式2015-11-06T14:24:52.4025753 Z ISO 8601
"O“或"o”标准格式说明符使用保留时区信息并发出符合ISO 8601的结果字符串的模式表示自定义日期和时间格式字符串。
https://stackoverflow.com/questions/29222410
复制相似问题