目的

  • 讀取appsetting設定檔
  • 二階段初始化
  • 為了簡單化故將Log存入SQLite

建立新專案

選擇ASP.NET Core Web API專案範本,並執行下一步 步驟1

設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。 步驟2

其他資訊

直接進行下一步 步驟3

NuGet加入套件

  • Serilog.AspNetCore
  • Serilog.Sinks.SQLite

步驟4

編輯Program.cs檔

using Serilog;
 //第一階段初始化
 // var builder = WebApplication.CreateBuilder(args);未使用二階段參數化,builder會跑到try外面
Log.Logger = new LoggerConfiguration()
  //.ReadFrom.Configuration(builder.Configuration)
  .CreateBootstrapLogger();
try {
  var builder = WebApplication.CreateBuilder(args);
  // Add services to the container.

  builder.Services.AddControllers();
  // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  builder.Services.AddEndpointsApiExplorer();
  builder.Services.AddSwaggerGen();
  //第二階段初始化可以取得appsetting的內容,如不使用第二階段初始化,
  //會需要將 var builder宣告式會移出try(如上方註解處),就會有風險未捕獲builder的錯誤
  builder.Host.UseSerilog(
      (hostingContext, services, loggerConfiguration) => {
        //使用appsetting
        loggerConfiguration.ReadFrom.Configuration(builder.Configuration);
      });
  var app = builder.Build();

  // Configure the HTTP request pipeline.
  if (app.Environment.IsDevelopment()) {
    app.UseSwagger();
    app.UseSwaggerUI();
  }

  app.UseHttpsRedirection();
  //紀錄每個Request的資料,須注意要放在讀取靜態檔案(app.UseStaticFiles())後面,因為靜態檔案的狀態通常不需要紀錄資訊
  app.UseSerilogRequestLogging();
  //以下省略

範例5-1

編輯appsetting.json

設定Serilog,包含

  • 最低紀錄標準為Information
  • Microsoft.AspNetCore開頭類別紀錄標準為Warning
  • 寫Log檔到console
  • 寫Log檔到File,並請用日期分割檔案
  • 寫Log檔到SQLite,資料表名稱為Logs,限制DB最大為1M,預設還有一個參數rollOver為true,當達到限制,就會分割DB
{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning"
      }
    },
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "File",
        "Args": {
          "path": "./logs/log-.txt",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "SQLite",
        "Args": {
          "sqliteDbPath": "../../../logs/log.sqlite",
          "tableName": "Logs",
          "maxDatabaseSize": 1
        }
      }
    ]
  },
  "AllowedHosts": "*"
}

範例6-1

編輯WeatherForecastController.cs類別檔

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get() {
      //新增一個類型
      var StudentObject = new Student() { Id = 4, Name = "Bill", Age = 20 };
      //新增一個匿名類型
      var position = new { Latitude = 25, Longitude = 134 };
      //寫log等級為error的log,當需要紀錄物件時需要透過{@該物件}來表示
      _logger.LogError("Error Value: {@StudentObject}", StudentObject);
      _logger.LogError("Error Value: {@position}", position);
      return Enumerable.Range(1, 5).Select(index => new WeatherForecast {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = Random.Shared.Next(-20, 55),
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]
      })
      .ToArray();
    }
    public class Student {
      public int Id { get; set; }
      public string Name { get; set; }
      public int Age { get; set; }
    }

範例7-1

執行結果

F5執行後,依照下列步驟操作,並確認結果 範例8-1 範例8-2 執行後查看Log檔 範例8-3 範例8-4 點擊txt檔案後會看到我們所寫的Log檔案,會發現

  • 第一個紅框處非匿名類型多一個$type跟你說明是什麼類型
  • 第二個紅框處是由於在Program.cs加入了app.UseSerilogRequestLogging();會記錄使用Get請求呼叫了WeatherForecast回傳狀態碼200用了31ms的時間 範例8-5

參考

Serilog m@rcus 學習筆記

範例檔

GitHub