web-dev-qa-db-fra.com

Utilisation de NLog dans l'application Web asp.net core 2.0

Quelle est la meilleure façon d'utiliser Nlog dans une application web asp.net core 2.0

J'ai trouvé beaucoup de solutions différentes pour configurer. En voici deux. Y a-t-il d'autres meilleures façons?

A) Créer un enregistreur avant de démarrer le serveur:

 public class Program
{
    public static void Main(string[] args)
    {    
        // NLog: setup the logger first to catch all errors
        var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();    
        try
        {
            logger.Debug("init main");
            BuildWebHost(args).Run();
        }
        catch (Exception e)
        {
            //NLog: catch setup errors
            logger.Error(e, "Stopped program because of exception");
            throw;
        }    
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>().UseNLog() // use NLog for DI Logger
            .Build();
}

B) Configurer à l'intérieur du démarrage

public class Startup
    {
        public Startup(IHostingEnvironment env, IConfiguration configuration)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();            
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {            
            services.AddMvc();                            
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddNLog();
            loggerFactory.ConfigureNLog("nlog.config");

            LogManager.Configuration.Variables["connectionString"] = Configuration.GetConnectionString("myDb");

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
        }
    }
8
Stephu

Il existe un document wiki à ce sujet:

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

Pour injecter des données personnalisées comme votre chaîne de connexion, créez et enregistrez simplement un rendu de disposition personnalisé:

https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer

Ou mettez la chaîne de connexion dans le NLog-Global-Diagnostic-Context au démarrage:

https://github.com/NLog/NLog/wiki/Var-Layout-Renderer

Peut-être quelque chose comme ça où NLog.config fait usage de ${gdc:connectionString}:

var myConnectionString = Configuration.GetConnectionString("myDb");
NLog.GlobalDiagnosticsContext.Set("connectionString", myConnectionString);
var logFactory = NLogBuilder.ConfigureNLog("NLog.config"); // Uses ${gdc:connectionString}
var logger = logFactory.GetCurrentClassLogger();
logger.Info("Hello World");

Voir aussi https://github.com/NLog/NLog/wiki/Gdc-Layout-Renderer

Mise à jour - $ {configsetting}

NLog.Extension.Logging ver. 1.4 prend désormais en charge ${configsetting} afin que NLog puisse lire directement les paramètres de appsettings.json sans avoir besoin d'utiliser des variables NLog. Voir https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer

5
Rolf Kristensen

Voici donc ce que j'ai essayé et utilisé dans mon projet pour afficher les journaux sur la console.

  • Installez les packages ci-dessous à l'aide de nuget

  • créez un nouveau fichier avec le nom nlog.config et ajoutez-le à votre projet avec le contenu ci-dessous.

<?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">

 <extensions>
    <add Assembly="NLog.Web.AspNetCore"/>
  </extensions>
  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target name="file" xsi:type="File"
            fileName="${basedir}/App_Data/Logs/${shortdate}.txt" encoding="utf-8" layout="[${longdate}][${machinename}][${level}] ${message} ${exception}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <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-web" />
  </rules>
</nlog>
  • Assurez-vous maintenant que votre appsettings.json a ces configurations minimales pour voir les journaux sur la console.
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default":"Trace",
      "Microsoft": "Warning"
    }
  }
  • Configurez Program.cs pour utiliser ce NLog tiers comme enregistreur.
    using NLog;
using  NLog.Extensions.Logging;     

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                .UseKestrel(options =>
                {
                    // options.Listen(IPAddress.Loopback, 5000); //HTTP port
                })
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .ConfigureLogging((hostingContext, logging) =>
                                {
                                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                                    logging.AddConsole();
                                    logging.AddDebug();
                                    logging.AddEventSourceLogger();
                                    // Enable NLog as one of the Logging Provider
                                    logging.AddNLog();
                                })
                    .UseStartup<Startup>();

Note: J'ai utilisé l'extrait de code pour insérer le code car je ne suis pas en mesure de formater correctement le code dans l'éditeur actuel.

1
Hameed Syed