NLog параллельные запросы в разные файлы - PullRequest
0 голосов
/ 25 мая 2018

Как видно из заголовка, я пытаюсь регистрировать отдельные запросы к моим контроллерам .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 голосов
/ 25 мая 2018

Переменные находятся на глобальном уровне, и они не будут работать в многопоточной среде (запрос http)

Хорошее решение - установить guid на уровне HttpContext:

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

и используйте

${aspnet-item:variable=myvariable}

Вам необходим NLog.Web.AspNetCore пакет для ASP.NET Core - для неосновного ASP.NET вам нужно NLog.Web

...