繁体   English   中英

Nlog $ {event-context:item = xxxx}未写入日志数据库

[英]Nlog ${event-context:item=xxxx} not writing in logging database

我有一个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项目,它已正确填充。

未知的Nlog状态

有人对我想念的东西有想法吗? 我不知道这可能是什么。

事实证明,这是NLog中的错误(或功能)。 当异步写入NLog中的“目标”时,写入的原始LogEventInfo将添加到新LogEventInfoParameters集合中,因此{event-context}从中获取其值的Properties集合为空(因为它是新的宾语)。 结果将空字符串写入数据库。

因此,为了解决此问题,我将此功能添加到了<< NLog 2.1 Source >> \\ Targets \\ Target.cs:

    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)函数protected virtual void Write(AsyncLogEventInfo logEvent)我更改了此代码

        try
        {
            this.Write(logEvent.LogEvent);
            logEvent.Continuation(null);
        }

到这个:

        try
        {
            MergeEventProperties(logEvent.LogEvent);

            this.Write(logEvent.LogEvent);
            logEvent.Continuation(null);
        }

之后,我的值被写入数据库。

希望对其他遇到此问题的人有所帮助。

您必须手动填写LogEvent.Properties,否则所有事件上下文项都将呈现“”。 这些不是自动生成的

https://github.com/nlog/nlog/wiki/EventProperties-Layout-Renderer

NLog文档中的事件上下文已更改为事件属性

感谢您的修复。 自从您的原始位置以来,此问题已稍有发展。

追了所有的补丁GitHub的(后334331371与此相关的问题),并检查他们没有被逆转,我发现${event-context:item=x}似乎不正常工作${event-properties:item=x}可以了。 公平地说,他们确实提到上下文已过时。 因此,建议您更改NLog.config以使用event-properties

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM