Utiliser NLog dans ASP.NET application de base

j'ai trouvé un CodeProject avec un exemple de comment faire pour que cela fonctionne, mais cela ne fonctionne pas. Le problème principal semble être que le paquet "Microsoft.Framework.Logging.NLog": "1.0.0-*" ne semble pas exister dans Nuget. J'ai regardé cette question de flux empilé et j'ai regardé 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 seul et le mieux 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 hack, mais je n'étais pas sûr de la meilleure façon de l'implémenter.

  1. est-ce que cela ressemble à une option de mise en œuvre valide?
  2. y a-t-il une meilleure façon de mettre en œuvre BeginScopeImpl?
  3. y a-t-il une autre façon d'amener NLog à travailler avec ASP.NET 5?
24
demandé sur Community 2016-01-08 17:47:03

5 réponses

Microsoft.Framework.Journalisation.NLog a été remplacé par NLog.Extension.Logging on NuGet , qui est maintenu par l'équipe NLog.

pour ASP.NET Core you need NLog.Web.AspNetCore (qui dépend de NLog.Extension.L'exploitation forestière)

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, log et filtre, Voir aussi README.md in 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-propre-2016-02-14.log "contient:

2016-02-14 16:27:04.0547|aspnet5application.Contrôleurs|INFO|créé homeController

2016-02-14 16:27:04.0547|aspnet5application.Contrôleurs|INFO|créé homeController

Cheers,

Julian (NLog)

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

37
répondu Julian 2017-03-30 22:12:09

mise à Jour Julian réponse : NLog.Framework.Enregistrement est marqué comme obsolète, utiliser NLog.Extension.Enregistrement à la place (juste un paquet de renommer, tout de même). De plus, env.ConfigureNLog("nlog.config"); ne fonctionne que pour le débogage dans Visual Studio (IIS Express). Après que j'ai publié le service à l'IIS régulier sur l'environnement de test, il n'a pas réussi à commencer avec 500 internal server error . Passé beaucoup de temps à comprendre le service ne pouvait pas trouver nlog.config à démarrage plus. Finalement trouvé la solution dans les questions NLog :

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

la matière est quand déboguer localement le répertoire de travail est le répertoire de votre projet avec nlog.config à l'intérieur, mais après la publication à 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
répondu Denis 2017-05-23 10:31:25

également utilisable pour l'application .net core console.

private static void ConfigureNlogConfig(string configFile){
  LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default.Application.ApplicationBasePath,configFile), true);
}
4
répondu Ersin Tarhan 2017-05-07 21:28:58

il y a maintenant des pages Wiki officielles pour savoir comment utiliser NLog avec ASP.NET Central:

NLog.Web.AspNetCore-Wiki-Getting started with ASP.NET noyau 2.0

NLog.Web.AspNetCore-Wiki-Getting started with ASP.NET noyau 1.0

1
répondu Rolf Kristensen 2018-06-02 13:37:33

nous pouvons utiliser nlog pour la connexion à L'application Dotnet core 2. il y a peu d'approche de changement de bit pour le chargement de la configuration de nlog. nous devons lire la configuration dans le démarrage.cs fichier.

NLog plugin est disponible dans Nuget. Pour plus d'informations et de fin pour mettre fin à la mise en œuvre Cliquez ici

0
répondu Ankit 2018-06-02 11:01:23