NLog 并发请求到不同的文件

NLog Concurrent Requests into different files

如标题所示,我正在尝试将单独的请求记录到我的 .NET Web API 控制器以分隔文件。

随着 {var} 的引入,以下是我在我的 C# 代码中尝试的内容。

private static Logger logger = LogManager.GetLogger("test");
[HttpPost, Route("xyz")]
public IHttpActionResult Post(Obj value)
{
    var guid = Guid.NewGuid();
    LogManager.Configuration.Variables["test"] = guid.ToString();
    logger.Info(value);
    //do my execution here.
}

我的 Nlog.Config 看起来像这样:

<variable name="test" value=""/>
<targets async="true">
    <target xsi:type="File" 
    name="concurrents" 
    fileName="${basedir}/nlogs/${logger}/${var:test}.log" 
    layout="${uppercase:${level}} |  ${callsite} | ${date:format=HH\:mm\:ss.fff} | &quot;${message}&quot;" 
    createDirs="true" />
    </target>
</targets>
<rules>
    <logger name="test" minlevel="Info" writeTo="concurrents"></logger>
</rules>

你们可能已经知道,

当出现并发请求时,我试图通过创建一个新的 Guid 并将其分配给 {var} 并以 var 的名称创建文件来记录每个请求。

日志以某种方式混淆了,一半的请求在一个文件中,另一半在另一个文件中。

老实说,我想我错过了一些我应该知道但不确定在哪里的基本知识。

如果有人能指出正确的方向并帮助我理解如何在不同的文件中记录当前请求,那就太好了。

干杯

变量处于全局级别,不适用于多线程环境(http 请求)

一个好的解决方案是在 HttpContext 级别设置 guid:

HttpContext.Current.Items["myvariable"] = guid.ToString();

并使用

${aspnet-item:variable=myvariable}

你需要NLog.Web.AspNetCore package for ASP.NET Core - for ASP.NET non-core you need NLog.Web