Asp.Net Core 專案中使用 Serilog 輸出日誌到 Elasticsearch
阿新 • • 發佈:2020-08-27
環境說明
伺服器: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;Program.cs6 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 }
在 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 列。