しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core 1.0 に組み込まれたロギングフレームワーク

ASP.NET Core 1.0 はフレームワークの足回りのアップデートが大量に行われています。その中でもロギングフレームワークが標準で提供されているのは、割と重要な点だと思います。

Logging in .NET Core and ASP.NET Core | Microsoft Learn

公式ドキュメントのファンダメンタルズ以下にまとめられています。この辺りは、実際に開発を行う前にしっかりと理解をしておきたいので、一通り触ってみるつもりです。

例によって Logging を使う前には DI にサービスを追加する必要があるので、AddLogging メソッドを呼び出しておきます。これで ILoggerFactory と ILogger<T> が DI 経由で扱えるようになります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
}

Configure では ILoggerFactory に対してプロバイダの追加を行っておきます。

テンプレートから作ると、コンソールに出力するプロバイダと、Visual Studio のデバッグウィンドウに出力するプロバイダを追加されています。ILoggingProvider を実装することで、独自のプロバイダを実装出来ます。

デフォルトで用意されているプロバイダは以下の通りです。

  • Console
  • Debug
  • TraceSource
  • Windows EventLog

Visual Studio と Azure Web Apps を使う場合には Console と Debug ぐらいで良いかもしれないですが、TraceSource や独自プロバイダを実装することも考慮しておいた方が良いかもしれません。

appsettings.json にある Logging の設定は以下のような感じで、出力する LogLevel の設定が行われています。

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

Startup クラスで設定を行えば、あとはコントローラなどのクラスで ILogger<T> を受け取るようにすれば、簡単にロギングを行えるようになります。

この時に型パラメータを指定しないと、DI で解決されないので注意が必要です。

型パラメータにはロガーを利用するクラスを指定すれば問題ないので、一番シンプルなコントローラは以下のような感じになると思います。

public class HomeController : Controller
{
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    private ILogger<HomeController> _logger;

    public IActionResult Index()
    {
        _logger.LogInformation("hauhau");
        _logger.LogError("hauhau");

        return View();
    }
}

ILogger に対しては拡張メソッドが用意されているので、適切な LogLevel でログを出力するようにします。

この時にコンストラクタで ILogger<T> ではなく ILoggerFactory を受け取るようにすると、任意の ILogger をいくつも作成することが出来ます。

public class HomeController : Controller
{
    public HomeController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger("HomeController");
    }

    private ILogger _logger;

    public IActionResult Index()
    {
        _logger.LogInformation("hauhau");
        _logger.LogError("hauhau");

        return View();
    }
}

これを実行してみると、Visual Studio のデバッグウィンドウにログが出力されます。AddDebug が出力する LogLevel のデフォルト設定が Information 以上なので、Trace / Debug の場合は出力されません。

コンソールで起動すると、AddConsole で行った設定の通りにフィルタリングされてログが出力されます。

他にもロギング周りには Scope や EventId など機能がありますが、ロギングの本質的な部分ではないので省略します。プロバイダとしての機能はデフォルトでは貧弱ですが、拡張性があるので既存のフレームワークを組み合わせるか、TraceListener を上手く活用する必要があるかなと思います。

自分としては Event Hubs にログを流し込んでいきたいので、適当にプロバイダを書いて遊びたいです。