はじめに
.Net Frameworkも4.8が最後のバージョンで 、.Net Coreの後継である.Net5がメインストリームになるようです。そろそろ、.Net Coreについて調べてみるかということで、まず、 ログの出力方法について調べてみました。
ASP .Net Coreでは、標準でILoggerというインターフェースが用意されています。
コンソールへの出力やイベントログへの書き込み等標準で用意されているようですが、やっぱり使い慣れたlog4netを使いたいです。
前提条件
log4netライブラリを直接使用することもできるようですが、やはりお作法に従いたいのと.Net Coreが出力するログ等もlog4netで出したいので、ILoggerの拡張機能を使用します。
ASP .Net Core プロジェクトにlog4netを追加
以下の拡張ライブラリをNuGetで追加します。
Microsoft.Extensions.Logging.Log4Net.AspNetCore
log4netの設定ファイルをプロジェクトに追加します。
log4net.config (デフォルト名)
.Net Core3.1では、log4net.configでファイルのパスに${特殊フォルダ}が使えません。クロスプラットフォームだからだよね?
log4netを使用するようにコードを変更します。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//log4netロギングプロバイダを追加。(デフォルトのプロバイダは削除)
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.AddLog4Net();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
};
ログ出力レベルの設定は、以下のファイルが優先されます。
このファイルですべて出力にしておいて、log4net.configで制御するのがいいと思います。
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
ASP .Net Core プロジェクトのサンプルコントローラーにログを追加してみます。
private readonly ILogger<WeatherForecastController> logger_;
//コンストラクタでILoggerのインスタンスを受け取ります。
public WeatherForecastController( ILogger<WeatherForecastController> logger)
{
logger_ = logger;
}
[HttpGet]
public IEnumerable< WeatherForecast> Get()
{
//ログを出力します。
logger_.LogInformation("Get was called.");
...
}
最後に
こうしておくと、log4netが使えない時に切り替えも簡単でいいですね。
設定ファイルがappsettings.jsonとlog4net.configと2つになるので、切り替えるときは注意が必要ですが。