kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

ASP.NET CoreとSerilogでログをファイル出力する

本章では、ASP.NET Coreでログを利用できるように設定します。

はじめに

ASP.NET Coreでは、標準でロギングのフレームワークが提供されています。しかし機能は、充実しておらず、自前で実装するか外部のプロバイダを利用する必要があります。今回は、Serilogが提供するロギング機能を利用し、ログファイルを出力する設定を行います。

準備

ライブラリのインストール

まず、プロジェクトに以下ライブラリをNuGetからインストールします。

  • Serilog.Extensions.Logging.File

なお今回使用するライブラリの詳細は、以下リンク先に記載されています。
github.com

設定ファイル

次に、ログの設定をappsettiengs.jsonファイルに記述します。ここでファイルがローテートするルールを記述できます。デフォルトでは、1GB超えると新しいファイルが作られ、31件を超えると古いファイルから削除されます。詳細は公式サイトを確認してください。
【appsettings.json

{
  "Logging": {
    "Json": false,
    "PathFormat": "logs/log-{Date}.txt",
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Information"
    }
  }
}

実装

そして実装で出力の流れについて説明します。Startupクラスで、Serilogのファイル出力ライブラリを読み込み設定します。
【Startup.cs】

    public class Startup
    {
        public static IConfigurationRoot Configuration { get; private set; }

        public Startup(IHostingEnvironment env)
        {
            // appsettings.jsonファイルの読み込み
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            var mvc = services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            // Serilogを使用してファイルにログを出力
            loggerFactory.AddFile(Configuration.GetSection("Logging"));

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{param?}");
            });
        }
    }

ログを出力する方法は、以下の通り、コントローラーやサービスでロギングのサービスを注入して利用します。
【Controllers/HomeController.cs】

    public class HomeController : Controller
    {
        readonly ILogger<HomeController> log;

        public HomeController(ILogger<HomeController> _log)
        {
            log = _log;
        }

        public ActionResult Index()
        {
            log.LogInformation("Hello, world!");
            return View();
        }
    }

【Views/Home/Index.cshtml】

Hello, world!

実際に出力されたログは以下の通りです。プロジェクトフォルダの直下「logs」フォルダ内に、ログファイルが日付単位で出力されます。

2016-11-02T20:35:44.6165321+09:00 0HL032HH1KVM5 [INF] Request starting HTTP/1.1 DEBUG http://localhost:49783/  0 (e5be5b71)
2016-11-02T20:35:44.6165321+09:00 0HL032HH1KVM4 [INF] Request starting HTTP/1.1 GET http://localhost:49783/   (e5be5b71)
2016-11-02T20:35:44.7526293+09:00 0HL032HH1KVM5 [INF] Request finished in 131.352ms 200  (15c52c40)
2016-11-02T20:35:45.5942266+09:00 0HL032HH1KVM4 [INF] Executing action method "Web.Controllers.HomeController.Index (Web)" with arguments (null) - ModelState is Valid (ba7f4ac2)
2016-11-02T20:35:45.6022348+09:00 0HL032HH1KVM4 [INF] Hello, world! (f83bcf75)
2016-11-02T20:35:48.0518997+09:00 0HL032HH1KVM4 [INF] Executing ViewResult, running view at path "/Views/Home/index.cshtml". (9707eebe)
2016-11-02T20:35:48.2740576+09:00 0HL032HH1KVM4 [INF] Executed action "Web.Controllers.HomeController.Index (Web)" in 2800.2296ms (afa2e885)
2016-11-02T20:35:48.3100849+09:00 0HL032HH1KVM4 [INF] Request finished in 3730.3904ms 200 text/html; charset=utf-8 (15c52c40)
2016-11-02T20:35:48.6308175+09:00 0HL032HH1KVM6 [INF] Request starting HTTP/1.1 GET http://localhost:49783/favicon.ico   (e5be5b71)
2016-11-02T20:35:48.6358213+09:00 0HL032HH1KVM6 [INF] Request finished in 5.1298ms 404  (15c52c40)

筆休め

ログは、システムに障害があった場合の原因究明やパフォーマンスの確認といった、業務で発生した事実の確認やサービス向上のために重要な情報となります。そのため、サービスを本格開発する前に、仕組みを用意することが重要となります。

以上、「ASP.NET CoreとSerilogでログをファイル出力する」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.