これまではNLogを利用することが多かったのですが、パフォーマンスやお手軽さからSerilog — simple .NET logging with fully-structured eventsを使用してみようと思います。
前提条件
対象のプロジェクトはASP.NET Core2で作成しました。
設定方法
ASP.NET Core2でserilog/serilog-aspnetcore: Serilog integration for ASP.NET Core 2+の設定は以下の通りとなります。
- NuGetパッケージのインストール
- Program.csの変更
NuGetパッケージのインストール
NuGetパッケージは以下のものをインストールします。
- Serilog.AspNetCore -DependencyVersion Highest
- Serilog.Sinks.Console
- Serilog.Sinks.RollingFile
インストール後のプロジェクトファイルは以下の通りとなります。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
<PackageReference Include="Npgsql" Version="3.2.5" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="2.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1-dev-00757" />
<PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.1-dev-00771" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>
</Project>
Program.csの変更
Program.csは以下の通り変更します。
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.RollingFile("logs/beagle-customer-{Date}.log")
.CreateLogger();
try
{
var host = BuildWebHost(args);
host.Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
// ここでログの利用を宣言する
.UseSerilog()
.Build();
}
ポイントはMainメソッド内でLoggerの設定を行い、例外がスローされたときにもログを出力するように設定していることです。
// ロガーの設定を行う
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
// コンソールへの出力を行う
.WriteTo.Console()
// ファイルへの出力を行う
.WriteTo.RollingFile("logs/beagle-customer-{Date}.log")
.CreateLogger();
なお、出力先についてはNuGetで公開されているSink(NuGet Gallery | Packages matching Tags:"serilog")を利用することで柔軟に対応ができます。
設定した内容はUseSerilog()
メソッドを設定することで利用可能となります。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
// ここでログの利用を宣言する
.UseSerilog()
.Build();
感想
最初はASP.NET Core2についてもよく知らなかったので戸惑うことが多かった(特にテストプロジェクトでの出力とか)ですが、慣れてくるとログの出力先などSinkが色々とあって便利だなと感じました。
参考
Serilog vs NLog Benchmarks