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()の実装について触れている。
→ソースに直接設定を書く
コメント
コメントを投稿