NLog并发请求到不同的文件

时间:2018-05-25 10:57:57

标签: c#-4.0 concurrency asp.net-web-api2 nlog

正如标题所示,我正在尝试将单独的请求记录到我的.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的名称创建文件来记录每个请求。

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

说实话,我想我错过了一些我应该知道的基本问题,但不知道在哪里。

如果有人指出正确的方向并帮助我了解如何在不同文件中记录当前请求,那将是很棒的。

干杯

1 个答案:

答案 0 :(得分:0)

变量处于全局水平,并且无法使用多线程环境(http请求)

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

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

并使用

${aspnet-item:variable=myvariable}

你需要NLog.Web.AspNetCore ASP.NET核心包 - 对于你需要的ASP.NET非核心NLog.Web