В моем приложении .Net 4.8 MVC я пытаюсь писать журналы с помощью NLog. Одним из полей является traceId — ${aspnet-TraceIdentifier}, которое предполагается поддерживать NLog.Web.
Поэтому я следовал документации и установил:
Я поместил свой NLog.config в каталог проекта:
<?xml version = "1.0" ?>
<nlog autoReload = "true"
xmlns = "http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
throwExceptions = "true"
internalLogLevel = "trace"
internalLogFile = "c:\test\internal-nlog.txt">
<targets>
<target name = "ws" xsi:type = "WebService" protocol = "JsonPost"
url = "https://log-api.com/log/v1">
<parameter name = "time" layout = "${date}" />
<parameter name = "level" layout = "${level:upperCase=true}"/>
<parameter name = "message" layout = "${message}" />
<parameter name = "host" layout = "${machinename}" />
<parameter name = "threadid" layout = "${threadid}" />
<parameter name = "ActivityId" layout = "${activityId}" />
<parameter name = "processId" layout = "${processId}" />
<parameter name = "threadid" layout = "${threadid}" />
<parameter name = "event-properties" layout = "${all-event-properties}" />
<parameter name = "exception" layout = "${exception}" />
<parameter name = "traceId" layout = "${aspnet-TraceIdentifier}" />
<parameter name = "environment" layout = "Production" />
<parameter name = "serviceName" layout = "company-api2222222" />
<parameter name = "session" layout = "${aspnet-session}"/>
<parameter name = "sessionId" layout = "${aspnet-sessionid}"/>
<header name = "X-License-Key" layout = "${environment:LICENSE_KEY}"/>
</target>
</targets>
<rules>
<logger name = "*" minlevel = "Trace" writeTo = "ws" />
</rules>
</nlog>
Согласно документации дальнейшая настройка не требуется: «Просто установите пакет. NLog автоматически обнаружит расширение».
Итак, внутри моего контроллера я просто получаю текущий регистратор классов и регистрирую:
NLog.LogManager.GetCurrentClassLogger().Info("Hello World");
Но, к сожалению, значение ${aspnet-TraceIdentifier} пусто, и самое ужасное, что я не могу найти никакой документации о том, как заставить его работать.
Я попытался поместить тег расширения над целями в файле NLog.config.
<extensions>
<add assembly = "NLog.Web"/>
</extensions>
и даже пробовал это:
<extensions>
<add assembly = "NLog.Web.AspNetCore"/>
</extensions>
Но ничего не изменилось. Кто-нибудь может помочь? Есть что-то, чего мне не хватает? может все-таки проблема с конфигурацией?





Неясно, используете ли вы ASP.NET или ASP.NET Core.
Итак, ответ для обоих:
Для ASP.NET вы должны использовать <add assembly = "NLog.Web"/> и пакет NLog.Web.
будет использоваться внутри HttpWorkerRequest.RequestTraceIdentifier.
Для ASP.NET Core вы должны использовать <add assembly = "NLog.Web.AspNetCore"/> и пакет NLog.Web.AspNetCore.
NLog использует их для traceindentifier:
ASP.NET Core 3-5: используйте System.Diagnostics.Activity.Current.Id (по умолчанию) или HttpContext.TraceIdentifier
ASP.NET Core 1+2: HttpContext.TraceIdentifier
Для ASP.NET Core 3-5 вам может понадобиться ignoreActivityId. например ${aspnet-TraceIdentifier:ignoreActivityId=true} - если правда - HttpContext.TraceIdentifier будет использоваться вместо System.Diagnostics.Activity.Current.Id
Смотрите также: github.com/NLog/NLog/issues/4217