Nlog $ {event-context:item = xxxx}没有在日志记录数据库中写入

时间:2014-04-24 14:52:01

标签: c# asp.net nlog

我的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项,并且它已正确填充。

Uknown Nlog state

任何人都知道我错过了什么?我不知道它可能是什么。

3 个答案:

答案 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)

感谢您的解决方案。自你原定位以来,这个问题已经略有发展。

追逐与此问题相关的所有github补丁(334331371)并检查它们是否已被撤消后,我发现{{ 1}}似乎不再正常工作,但${event-context:item=x}确实如此。公平地说,他们确实提到了上下文已被弃用。所以更改你的NLog.config以使用${event-properties:item=x}是我的建议。

哦,我正在使用NLog v4.1.0和NLog.Extended v4.0.0.1,以防将来出现这种情况。