net log asp asp.net-core nlog ms-extensions-logging

asp.net core - Usar NLog en la aplicación Core de ASP.NET



asp net core log to file (5)

Actualice a la respuesta de Julian : NLog.Framework.Logging está marcado como obsoleto, use NLog.Extensions.Logging en su lugar (solo un nombre de paquete, sin embargo). Además, env.ConfigureNLog("nlog.config"); funciona bien solo para la depuración en Visual Studio (IIS Express). Después de haber publicado el servicio a IIS regular en el entorno de prueba, no se pudo iniciar con 500 internal server error . Pasó bastante tiempo para descubrir que el servicio ya no podía encontrar nlog.config en el inicio. Finalmente encontré solución en problemas de NLog :

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationEnvironment appEnv) { ... env.ConfigureNLog(Path.Combine(appEnv.ApplicationBasePath, "nlog.config")); ... }

La materia es cuando la depuración del directorio de trabajo local es el directorio de su proyecto con nlog.config en nlog.config interior, pero después de publicar en IIS, todos los archivos de origen están en %PATH_TO_PUBLISHED_SERVICE%/approot/src/%PROJECT_NAME%/ mientras el directorio de trabajo es %PATH_TO_PUBLISHED_SERVICE%/ .

Encontré un CodeProject con un ejemplo de cómo hacer que esto funcione, pero no funciona. El principal problema parece ser que el paquete "Microsoft.Framework.Logging.NLog": "1.0.0-*" no parece existir en Nuget. He mirado esta pregunta de StackOverflow y he visto el ejemplo de GitHub al que hace referencia, pero parece contener el mismo problema.

He intentado hacerlo funcionar por mi cuenta y lo mejor que he encontrado es lo siguiente:

public class NLogLogger : ILogger { public NLogLogger() { new WebLoggerConfigurer().ConfigureDefault(); } public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter) { // currently need the global:: for LogLevels because our namespace contains NLog in it. Is there a better naming convention we could use instead? var ll = logLevel == LogLevel.Debug ? global::NLog.LogLevel.Debug : logLevel == LogLevel.Verbose ? global::NLog.LogLevel.Trace : logLevel == LogLevel.Critical ? global::NLog.LogLevel.Fatal : logLevel == LogLevel.Error ? global::NLog.LogLevel.Error : logLevel == LogLevel.Information ? global::NLog.LogLevel.Info : logLevel == LogLevel.Warning ? global::NLog.LogLevel.Warn : global::NLog.LogLevel.Off; LogManager.GetCurrentClassLogger().Log(ll, formatter(state, exception)); } public bool IsEnabled(LogLevel logLevel) { return true; } public IDisposable BeginScopeImpl(object state) { return new Disposable(() => { }); } } public class NLogLoggerProvider : ILoggerProvider { public void Dispose() { } public ILogger CreateLogger(string categoryName) { return new NLogLogger(); } } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddProvider(new NLogLoggerProvider()); .. }

La implementación de BeginScopeImpl parece ser un truco, pero no estaba seguro de la mejor manera de implementarlo.

  1. ¿Parece esto una opción de implementación válida?
  2. ¿Hay alguna forma mejor de implementar BeginScopeImpl?
  3. ¿Hay otra forma de hacer que NLog funcione con ASP.NET 5?


Microsoft.Framework.Logging.NLog ha sido reemplazado por NLog.Extensions.Logging en NuGet , que es mantenido por el equipo de NLog.

Para ASP.NET Core necesita NLog.Web.AspNetCore (que depende de NLog.Extensions.Logging)

Cómo utilizar:

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(); //needed for non-NETSTANDARD platforms: configure nlog.config in your project root. NB: you need NLog.Web.AspNetCore package for this. 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>(); }

Ejemplo de cómo configurar, registrar y filtrar, vea también README.md en GitHub .

public class HomeController : Controller { protected ILogger Logger { get; } public HomeController(ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { Logger = loggerFactory.CreateLogger(GetType().Namespace); Logger.LogInformation("created homeController"); }

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="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}" /> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="*" minlevel="Trace" writeTo="ownFile" /> </rules> </nlog>

"nlog-own-2016-02-14.log" contiene:

2016-02-14 16: 27: 04.0547 | aspnet5application.Controllers | INFO | created homeController

2016-02-14 16: 27: 04.0547 | aspnet5application.Controllers | INFO | created homeController

Aclamaciones,

Julian (nlog)

Edición: actualizado para NLog.Web.AspNetCore 4.3


Podemos usar nlog para iniciar sesión en la aplicación Dotnet core 2. Hay un pequeño enfoque de cambio para cargar la configuración de nlog. Necesitamos leer la configuración en el archivo startup.cs.

El complemento Nlog está disponible en Nuget. Para más información y de extremo a extremo, haga clic en la implementación aquí.


También se puede usar para la aplicación de consola .net core.

private static void ConfigureNlogConfig(string configFile){ LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default.Application.ApplicationBasePath,configFile), true); }