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(); } } }
参考:
- .Net Coreでサードパーティのロガーを使用せずにファイルにログを記録する方法は?
- serilog Getting Started
- appsettings.jsonを使用したSerilog RollingFileの構成
→これが一番
→これ使って勉強した。
→WriteTo Consoleのsettings.jsonが記載されている。
→WriteTo.Trace()の実装について触れている。
→ソースに直接設定を書く
コメント
コメントを投稿