[英]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中的“目标”时,写入的原始LogEventInfo
将添加到新LogEventInfo
的Parameters
集合中,因此{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文档中的事件上下文已更改为事件属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.