Ведение журнала ASP.NET Core не работает
Оказывается, проблема не была связана с
NLog
или система регистрации ASP.NET. Ведение журнала было настроено правильно, но сервер сборки публиковалDebug
построить в производство из-за ошибки конфигурации.
Я пытаюсь настроить сторонний регистратор в моем ASP.NET Core 2.0 (SDK 2.1.401
) проект. Пока я пробовал Serilog
а также NLog
, Однако у меня есть одна и та же проблема для обоих. Чтобы подвести итог вопроса,
- Он работает как задумано, когда я запускаю приложение, как
dotnet run
(т.е. вDevelopment
среда) - Но это не так, когда я запускаю двоичный файл
dotnet MyApplication.dll
(т.е. вProduction
среда). - У меня нет ничего определенного в
"Logging"
раздел дляDevelopment
среда в моемappsettings.Development.json
файл.
Проблема, описанная ниже, предназначена для NLog
, я пытался SeriLog
и попал в ту же проблему.
Вот соответствующая часть из Program.cs
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseApplicationInsights()
.UseStartup<Startup>()
.ConfigureLogging((env, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog()
.Build();
Обратите внимание, что я очистил все провайдеры и добавил NLog
так же nlog.config
файл определен:
<?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"
autoReload="true"
internalLogLevel="error"
internalLogFile="./internal-nlog.txt">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target name="Console"
xsi:type="Console"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="Console" />
</rules>
</nlog>
Когда работает в Development
режим, я вижу логи точно так, как я ожидал
$ dotnet run
Using launch settings from .. /Properties/launchSettings.json...
2018-09-16 19:04:39.7585||DEBUG|My.WebApp.Program|init main |url: |action:
Hosting environment: Development
Content root path: /Users/ ...
Now listening on: http://localhost:61638
Application started. Press Ctrl+C to shut down.
2018-09-16 19:04:46.5405|1|INFO|Microsoft.AspNetCore.Hosting.Internal.WebHost|Request starting HTTP/1.1 GET http://localhost:61638/api/_doc |url: http://localhost/api/_doc|action:
2018-09-16 19:04:46.7381|1|INFO|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|Executing action method My.WebApp.RestApi.Doc (My.WebApp) with arguments ((null)) - ModelState is Valid |url: http://localhost/api/_doc|action: Doc
Тем не менее, когда я запускаю приложение в Production
envoronment, консольный вывод выглядит так, как будто у меня его нет NLog
установлен, и я не очистил поставщиков по умолчанию.
dotnet .\My.WebApp.dll
Hosting environment: Production
Content root path: C:\inetpub\wwwroot\myapp\wwwroot
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:5000/
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Executing action method My.WebApp.Controllers.HomeController.Index (My.WebApp) with arguments ((null)) - ModelState is Valid
Обратите внимание, что эти строки начинаются с info:
? это стандартный формат ведения журнала консоли, который вы получаете при использовании настройки ведения журнала по умолчанию, определенной в Microsoft.Extensions.Logging
, Но я определенно очищен Console
провайдер по телефону logging.ClearProviders();
в Program.cs
файл.
Спасибо за любую помощь.
1 ответ
Я смог воспроизвести вашу проблему и исправить ее. Пожалуйста, найдите мою конфигурацию здесь.
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Information"
}
},
"AllowedHosts": "*"
}
nlog.config
<?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"
autoReload="true"
internalLogLevel="error"
internalLogFile="./internal-nlog.txt">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target name="Console"
xsi:type="Console"
layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="Console" />
<!--Skip non-critical Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" maxLevel="Info" final="true" />
<!-- BlackHole without writeTo -->
<logger name="*" minlevel="Trace" writeTo="Console" />
</rules>
</nlog>
Program.cs
public class Program
{
public static void Main(string[] args)
{
var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Debug("init main");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
//NLog: catch setup errors
logger.Error(ex, "Stopped program because of exception");
throw;
}
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
NLog.LogManager.Shutdown();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging((env, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog();
}
добавил следующую запись в файл.csproj
<ItemGroup>
<Content Update="nlog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Ссылка: