Dotnet Core2.2 でSerilogを使う

.net core2.1は、Microsoft.Extensions.LoggingのAddFileが使えた。
public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(lb =>
    {
        lb.AddConfiguration(Configuration.GetSection("Logging"));
        lb.AddFile(o => o.RootPath = AppContext.BaseDirectory);
    });
}

.net Core2.2は、まだ実装されていないので、サードパーティのプラグインを利用する必要があるようだ。

なので「Serilog」を利用する。


必要なモジュール

  • Serilog.AspNetCore(dotnet core)
  • Serilog.Sinks.Trace(Console Windowへの出力)
  • Serilog.Sinks.File(File出力)
  • Serilog.Sinks.Console(Console出力)
  • Serilog.Sinks.RollingFile(ファイル出力を日付単位等分割する)
  • Serilog.Settings.Configuration(appsettings.json)

appsettings.json
{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId", "WithThreadId" ],
    "WriteTo": [
      {
        "Name": "RollingFile",
        "IsJson": true,
        "Args": {
          "pathFormat": "F:/work/dotnet/WebApi/logs/log-{Date}.json",
          "textFormatter": "JsonFormatter",
          "restrictedToMinimumLevel": "Information",
          "fileSizeLimitBytes": 2147483648,
          "retainedFileCountLimit": 5
        }
      },
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "===> {Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
        }
      }
    ]
  },
....
}


Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace WebApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseSerilog();
                });
    }
}



Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Serilog;
using System.IO;

namespace WebApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {

            Configuration = configuration;
        }

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

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env) // , IConfiguration config)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

             // appsettings.jsonを読み込む準備
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            // ロガーを構築する
            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(config)
                //.MinimumLevel.Debug()     // When not use appsettings.json
                //.WriteTo.Console()        // When using Console Window.
                .WriteTo.Trace()
                .CreateLogger();
        }
    }
}



Controller
namespace WebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogDebug("デバッグろぐだよ!!!!!");
            _logger.LogInformation("インフォメーションろぐだよ");

            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
	}
}

参考:

→これが一番

→これ使って勉強した。

WriteTo Consolesettings.jsonが記載されている。

WriteTo.Trace()の実装について触れている。

→ソースに直接設定を書く


コメント

このブログの人気の投稿

ソリューション構成ごとにconfigファイルを作成する

C++の古いプロジェクトのビルドでerror MIDL2311 : statements outside library block are illegal in mktyplib compatability mode

web.config debug/releaseの内容を変換構文を使って切り替える