在文本文件NLog中记录唯一请求ID - 区分请求

时间:2013-11-20 06:20:26

标签: logging nlog

我在我的应用程序中使用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>

4 个答案:

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

相关问题