環境說明
伺服器:CentOS 7,IP:172.17.79.83
開發環境:Win10 + VS2019
Docker 啟動 Elasticsearch
docker run --name elasticsearch --restart always -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.5.0
Docker 啟動 Kibana
docker run --name kibana --restart always -d --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.5.0
項目配置
建立一個 WebAPI 項目,添加 nuget 包 Serilog.AspNetCore(目前最新版本 3.4.0)、Serilog.Sinks.Elasticsearch(v8.2.0)、Serilog.Exceptions(v5.6.0)。
将預設的 appsettings.json 中的内容替換成一下内容。
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "http://172.17.79.83:9200"
},
"AllowedHosts": "*"
}
Program.cs 中配置 Serilog
1 using System;
2 using System.Reflection;
3 using Microsoft.AspNetCore.Hosting;
4 using Microsoft.Extensions.Configuration;
5 using Microsoft.Extensions.Hosting;
6 using Serilog;
7 using Serilog.Sinks.Elasticsearch;
8 using Serilog.Exceptions;
9
10 namespace EFKlog
11 {
12 public class Program
13 {
14 private static readonly string env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
15 public static void Main(string[] args)
16 {
17 ConfigureLogging();
18
19 CreateHostBuilder(args).Build().Run();
20 }
21
22 public static IHostBuilder CreateHostBuilder(string[] args) =>
23 Host.CreateDefaultBuilder(args)
24 .ConfigureWebHostDefaults(webBuilder =>
25 {
26 webBuilder.UseStartup<Startup>()
27 .ConfigureAppConfiguration(cfg=>
28 {
29 cfg.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
30 cfg.AddJsonFile($"appsettings.{env}.json", optional: true, reloadOnChange: true);
31 })
32 .UseSerilog();
33 });
34
35 private static void ConfigureLogging()
36 {
37 var cfg = new ConfigurationBuilder()
38 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
39 .AddJsonFile($"appsettings.{env}.json", optional: true, reloadOnChange: true)
40 .Build();
41 Log.Logger = new LoggerConfiguration()
42 .Enrich.FromLogContext()
43 .Enrich.WithExceptionDetails()
44 .Enrich.WithProperty("Environment",env)
45 .WriteTo.Debug()
46 .WriteTo.Console()
47 .WriteTo.Elasticsearch(ConfigureElasticSink(cfg, env))
48 .ReadFrom.Configuration(cfg)
49 .CreateLogger();
50 }
51
52 private static ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot cfg,string env)
53 {
54 return new ElasticsearchSinkOptions(new Uri(cfg["ElasticConfiguration:Uri"]))
55 {
56 AutoRegisterTemplate = true,
57 IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{env?.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}"
58 };
59 }
60 }
61 }
Program.cs
在 api 中記錄日志。
public IEnumerable<WeatherForecast> Get()
{
_logger.LogInformation("WeatherForecast api executed at {date}",DateTime.UtcNow);
try
{
throw new Exception("some bad code was executed...");
}
catch (Exception ex)
{
_logger.LogError(ex, "調用天氣預報 api 出現錯誤!");
}
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
啟動項目,可以看到控制台日志格式發生了一點變化,同時日志消息使用了不同的顔色來區分。
在 kibana 中檢視日志,需要先建立一個索引。index 格式在Program.cs 中有設定,這裡保持寫法一緻就好。
檢視 kibana 面闆,需要展示的列可以自定義,比如添加 exception 列。