我的Nlog配置基本上是这样的:
<target type="Database" name="database" connectionstring="<working connection string>">
<commandText>insert into LogEntries ([Username], [Process], [TransactionCode], [WorkplaceId], [CreateDate], [Origin], [LogLevel], [Message], [Exception], [StackTrace]) values (@username, @process, @transactionCode, @workplaceId, @createDate, @origin, @logLevel, @message, @exception, @stackTrace);</commandText>
<parameter name="@username" layout="${event-context:item=username}"/>
<parameter name="@process" layout="${event-context:item=process}"/>
<parameter name="@transactionCode" layout="${event-context:item=transactionCode}"/>
<parameter name="@workplaceId" layout="${event-context:item=workplaceId}"/>
<parameter name="@createDate" layout="${date}"/>
<parameter name="@origin" layout="${callsite}"/>
<parameter name="@logLevel" layout="${level}"/>
<parameter name="@message" layout="${message}"/>
<parameter name="@exception" layout="${exception:format=message}"/>
<parameter name="@stackTrace" layout="${onexception: ${stacktrace}}"/>
</target>
日志记录基本上有效,标准的Nlog项目已成功写入数据库,但事件上下文项目在数据库中写成空字符串。
我已经检查了eventInfo对象上的Properties项,并且它已正确填充。
任何人都知道我错过了什么?我不知道它可能是什么。
答案 0 :(得分:2)
事实证明,这是NLog中的一个错误(或一个功能)。在写一个&#39;目标&#39;在NLog异步中,写入的原始LogEventInfo
被添加到新Parameters
的{{1}}集合中,因此LogEventInfo
集合中Properties
获取其值from是空的(因为它是一个新对象)。导致写入数据库的空字符串。
因此,为了解决这个问题,我将此函数添加到&lt;&lt; NLog 2.1 Source&gt;&gt; \ Targets \ Target.cs:
{event-context}
然后在函数 private void MergeEventProperties(LogEventInfo logEvent)
{
foreach (var item in logEvent.Parameters)
{
if (item.GetType() == typeof(LogEventInfo))
{
foreach (var propertyItem in ((LogEventInfo)item).Properties)
{
logEvent.Properties.Remove(propertyItem.Key);
logEvent.Properties.Add(propertyItem);
}
}
}
}
中我更改了此代码
protected virtual void Write(AsyncLogEventInfo logEvent)
进入这个:
try
{
this.Write(logEvent.LogEvent);
logEvent.Continuation(null);
}
之后,我的值被写入数据库。
我希望它可以帮助其他有这个问题的人。
答案 1 :(得分:0)
您必须手动填写LogEvent.Properties,否则所有事件上下文项都将呈现&#39;&#39;。这些不是自动生成的
https://github.com/nlog/nlog/wiki/EventProperties-Layout-Renderer
事件上下文已更改为NLog文档中的事件属性
答案 2 :(得分:0)