Ответ 1
Microsoft.Framework.Logging.NLog был заменен на NLog.Extensions.Logging в NuGet, который поддерживается командой NLog.
Для ядра ASP.NET вам нужен NLog.Web.AspNetCore (который зависит от NLog.Extensions.Logging)
Как пользоваться:
Настроить
Необходимо включить NLog, чтобы он интегрировался в API DI и log в ASP.NET Core. Это приведет к тому, что все журналы, написанные внешними (например, Microsoft), также будут отправлены в NLog - вы можете отфильтровать это в конфигурации NLog (без влияния на производительность)
Для ASP.NET Core 1 и ASP.NET Core 2 существуют разные подходы.
ASP.NET Core 1
В ASP.NET Core в Configure
и при необходимости ConfigureServices
необходимо обновить.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//add NLog to .NET Core
loggerFactory.AddNLog();
//Enable ASP.NET Core features (NLog.web) - only needed for ASP.NET Core users
app.AddNLogWeb();
//configure nlog.config in your project root.
env.ConfigureNLog("nlog.config");
...
//you could use LogManager.Configuration from here
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// e.g. services.AddMvc();
//needed for NLog.Web
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
ASP.NET Core 2
Для ASP.NET Core 2 настройка отличается от настройки в ASP.NET Core 1
Настройка NLog в program.cs:
using NLog.Web;
using Microsoft.Extensions.Logging;
public static void Main(string[] args)
{
// NLog: setup the logger first to catch all errors
var logger = NLog.Web.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(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseNLog(); // NLog: setup NLog for Dependency injection
Пишите логи
ILogger
с типом класса в качестве универсального аргумента.
public class HomeController : Controller
{
public HomeController(ILogger<HomeController> logger)
{
logger.LogInformation("created homeController");
}
Настроить правила NLog
Пример, как настроить, войти и фильтровать.
Создайте nlog.config (дополнительную информацию о nlog.config см. В документации).
В этом примере будет создано 2 файла, один из которых будет содержать все журналы (включая Microsoft) и файл только с вашими журналами.
<?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="Warn"
internalLogFile="c:\temp\internal.txt">
<extensions>
<!--enable NLog.Web for ASP.NET Core-->
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- define various log targets -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
<target xsi:type="File" name="ownFile" fileName="c:\temp\nlog-own-${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
</targets>
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Trace" writeTo="allfile" />
<!--Skip Microsoft logs - no writeTo attribute-->
<logger name="Microsoft.*" minlevel="Trace" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile" />
</rules>
</nlog>
Опубликовать nlog.config
Убедитесь, что nlog.config будет опубликован, например, в вашем файле csproj:
<ItemGroup>
<Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
Выход
"nlog-own-2018-02-14.log" содержит:
2018-02-14 16: 27: 04.0547 | aspnetCoreApplication.Controllers | INFO | создал homeController
2018-02-14 16: 27: 04.0547 | aspnetCoreApplication.Controllers | INFO | создал homeController
Устранение проблем
Отсутствует сообщение журнала отладки в ASP.NET Core 2? В то время как мы используем SetMinimumLevel
в SetMinimumLevel
, appsettings.json также может слить это.
Вы можете изменить это следующим образом:
Изменить appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Trace"
}
}
}
Вы также можете отфильтровать журналы Microsoft здесь, например
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Information"
}
}
}
Другие проблемы, см. Этот план шага, чтобы найти причину: Регистрация неполадок в NLog
Ура,
Джулиан (NLog)
Редактировать: обновлено для NLog.Web.AspNetCore 4.3
Редактировать 2: Обновлено для ASP.NET Core 2 и последних рекомендаций