我在我的应用程序中使用NLog日志记录机制。我遇到的问题是当并发请求命中时,应用程序日志记录是异步完成的,我无法识别哪一行属于哪个请求。在NLog中是否有办法将配置设置为NLog本身,为每个请求记录一个唯一的请求ID?
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<!-- add your targets here -->
<target xsi:type="File" name="file" fileName="E:\IBELogs\AirAvailability\AirAvailability.log" layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>
<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Trace" writeTo="file" />
</rules>
</nlog>
答案 0 :(得分:2)
您必须自己生成您的唯一身份证明。然后,您可以将唯一ID设置为MDC,并设置适当的布局格式,将您在MDC中的唯一ID输出到日志中。
答案 1 :(得分:2)
我们遇到了类似的问题,我们使用线程ID来识别日志文件中的行。因此,请指定如下布局:
<target ... layout="threadID: ${threadid} ${message}"/>
如果并发请求的性质不同,那么创建多个记录器可能是个好主意,每个记录器对应一种请求类型。然后你可以做这样的事情:
<target ... layout="logger: ${logger} ${message}"/>
我希望这会有所帮助。
答案 2 :(得分:2)
在NLog 4.1中引入了$ {activityid},请参阅here。我不能说MSDN documentation对它的价值已经足够清楚了,但到目前为止,这对我们来说是有用的,因为我们的webAPI应用程序中的每个请求都被分配了一个唯一的GUID,并且在我们看到的整个请求中保留它同一请求中的几个Nlog操作中的值相同。
答案 3 :(得分:2)
第1步。初始化Trace.CorrelationManager.ActivityId
中的Global.asax
protected void Application_BeginRequest()
{
Trace.CorrelationManager.ActivityId = Guid.NewGuid();
}
第2步。在NLog.config中添加$ {activiryid}
layout="${longdate}|${activityid}|${threadid}|${level:uppercase=true}|${callsite}|Line-${callsite-linenumber}|${message}"
然后可以将日志文件中的活动ID视为请求ID。