.NET Core开发实战课程备忘(12) -- 结构化日志组件Serilog:记录对查询分析友好的日志

结构化日志的好处

  • 易于检索
  • 易于分析统计

主要场景

  • 实现日志告警
  • 实现上下文的关联
  • 实现与追踪系统集成

代码实现

创建项目

创建名字为LoggingSerilogDemoASP.NET Core项目,类型为API,因为使用的日志结构化组件为Serilog,所以需要引入以下的包:

1
Serilog.AspNetCore

用Serilog替换自带的日志框架

修改Program类,让Serilog替换掉ASP.NET Core自带的日志框架,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Formatting.Compact;

namespace LoggingSerilogDemo
{
public class Program
{
public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();

public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console(new RenderedCompactJsonFormatter())
.WriteTo.File(formatter: new CompactJsonFormatter(), "logs\\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex,"Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}

}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
.UseSerilog(dispose: true);
}
}

代码解析:

  1. 新建Configuration静态属性,直接读取appsettings.json的配置
  2. new LoggerConfiguration是创建一个Seriloglogger对象,调的各种方法是进行日志配置
  3. CreateHostBuilder的时候用try...catch包住是确保应用程序从开启到结束都有日志输出,包括启动失败,最后Log.CloseAndFlush()表示应用程序结束时会释放日志资源
  4. UseSerilog表示正式引入Serilog组件,dispose:true表示应用程序关闭之后会自动释放日志资源

修改appsettings.json文件

appsettings.json文件中新增Serilog节点,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Information"
}
}
},
"AllowedHosts": "*"
}

输出日志

WeatherForecastController.Get方法中新增以下代码:

1
_logger.LogInformation("This is information log");

运行项目,可以看到控制台打印出了结构化的日志,同时在项目根目录也有一个logs文件夹,进入文件夹可以看到日志文件