web-dev-qa-db-ja.com

asp.netコア2.0 WebアプリケーションでのNLogの使用

Asp.netコア2.0 WebアプリケーションでNlogを使用する最良の方法はどれですか

設定方法の多くの異なるソリューションを見つけました。そのうちの2つです。他にもっと良い方法はありますか?

A)サーバーを起動する前にロガーを作成:

 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)起動時に設定

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

これに関するwikiドキュメントがあります:

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

接続文字列のようなカスタムデータを挿入するには、カスタムレイアウトレンダラーを作成して登録するだけです。

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

または、接続文字列を起動時にNLog-Global-Diagnostic-Contextに入れます。

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

たぶんNLog.config${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");

参照 https://github.com/NLog/NLog/wiki/Gdc-Layout-Renderer

更新-$ {configsetting}

NLog.Extension.Logging ver。 1.4が${configsetting}をサポートするようになったため、NLogはNLog変数を使用せずにappsettings.jsonから設定を直接読み取ることができます。 https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer を参照してください

5
Rolf Kristensen

これが、コンソールでログを表示するためにプロジェクトで使用してきたものです。

  • Nugetを使用して以下のパッケージをインストールします

  • nlog.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">

 <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>
  • appsettings.jsonにこれらの最小構成が含まれていることを確認して、コンソールにログを表示します。
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default":"Trace",
      "Microsoft": "Warning"
    }
  }
  • このサードパーティのNLogをロガーとして使用するようにProgram.csを構成します。
    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>();

:現在のエディターでコードを適切にフォーマットできないため、コードスニペットを使用してコードを挿入しました。

1
Hameed Syed