1. 程式人生 > 實用技巧 >Asp.Net Core 專案中使用 Serilog 輸出日誌到 Elasticsearch

Asp.Net Core 專案中使用 Serilog 輸出日誌到 Elasticsearch

環境說明

  伺服器: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 列。