これまでは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が色々とあって便利だなと感じました。
参考
- 作者: Adam Freeman
- 出版社/メーカー: Apress
- 発売日: 2017/11/25
- メディア: ペーパーバック
- この商品を含むブログを見る