web-dev-qa-db-fra.com

Utiliser NLog dans l'application ASP.NET Core

J'ai trouvé un CodeProject avec un exemple montrant comment le faire fonctionner, mais cela ne fonctionne pas. Le problème principal semble être que le paquetage "Microsoft.Framework.Logging.NLog": "1.0.0-*" ne semble pas exister dans Nuget. J'ai examiné cette question de StackOverflow et ai examiné l'exemple de GitHub auquel il fait référence, mais il semble contenir le même problème.

J'ai essayé de le faire fonctionner moi-même et le meilleur que j'ai trouvé est le suivant: 

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());
    ..
}

L'implémentation de BeginScopeImpl semble être un bidouillage, mais je ne savais pas comment l'utiliser au mieux.

  1. Cela vous semble-t-il une option d'implémentation valide?
  2. Existe-t-il une meilleure façon de mettre en œuvre BeginScopeImpl?
  3. Existe-t-il un autre moyen de faire fonctionner NLog avec ASP.NET 5?
25

Microsoft.Framework.Logging.NLog a été remplacé par NLog.Extensions.Logging sur NuGet , géré par l'équipe NLog.

Pour ASP.NET Core, vous avez besoin de NLog.Web.AspNetCore (qui dépend de NLog.Extensions.Logging).

Comment utiliser:

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>();
}

Exemple de configuration, de journalisation et de filtrage, voir aussi README.md dans 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" contient:

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

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

À votre santé,

Julian (NLog)

Edit: mis à jour pour NLog.Web.AspNetCore 4.3

39
Julian

Mise à jour de Réponse de Julian : NLog.Framework.Logging est marqué comme obsolète, utilisez NLog.Extensions.Logging à la place (un simple renommage du paquet, cependant). De plus, env.ConfigureNLog("nlog.config"); fonctionne correctement uniquement pour le débogage dans Visual Studio (IIS Express). Une fois que j'ai publié le service dans IIS normal dans un environnement de test, le démarrage avec 500 internal server error n'a pas abouti. J'ai passé beaucoup de temps à comprendre que le service ne pouvait plus trouver nlog.config au démarrage. Enfin trouvé la solution dans les problèmes NLog :

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

Le débogage local du répertoire de travail est le répertoire de votre projet avec nlog.config dedans, mais après la publication sur IIS, tous les fichiers source sont dans %PATH_TO_PUBLISHED_SERVICE%\approot\src\%PROJECT_NAME%\ tandis que le répertoire de travail est %PATH_TO_PUBLISHED_SERVICE%\.

5
Denis

également utilisable pour les applications de console .net.

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

Il existe maintenant des pages de wiki officielles expliquant comment utiliser NLog avec ASP.NET Core:

NLog.Web.AspNetCore - Wiki - Démarrer avec ASP.NET Core 2.0

NLog.Web.AspNetCore - Wiki - Démarrer avec ASP.NET Core 1.0

2
Rolf Kristensen