在我看来,NLog中的内置日期格式没有正确包含时区。我们需要使用尾随Z记录UTC时间,以便Splunk知道当地时间是什么,例如:
{date:universalTime = true:format = yyyy-MM-dd HH:mm:ss.ffffZ}
这会产生我们需要的正确日期。
我宁愿定义一个可以执行此操作的变量,而不是将其插入到多个应用程序的所有配置中,例如:
{ourdate}
我有一个黑客,但我不知道如何做到这一点。有可能吗?
由于
PS。 {longdate}确实包含时区,但它会减少毫秒数。
答案 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的结果字符串的模式的自定义日期和时间格式字符串。