.Net Core 使用 Serilog記錄日志並輸出至ElasticSearch


項目轉.netcore之后對於日志框架的選用在log4net、Nlog以及Serilog之間猶豫了很久,最終選擇了Serilog,在此記錄一下Serilog的初步配置使用

 

由於需要輸出至ElasticSearch,需要安裝ElasticSearch以及Kibana,參考:用Docker部署Elastic棧

 

配置使用Serilog

 

1. 首先增加Serilog的包引用

Serilog

Serilog.AspNetCore

Serilog.Extensions.Logging

Serilog.Sinks.Console

Serilog.Sinks.Elasticsearch

2. 添加appsettings.json中的基礎配置

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System":   "Information",
      "Microsoft": "Information"
    }
  }
}

 

3. 在Startup.cs的添加相關代碼

添加必要引用

using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Sinks.Elasticsearch;

在Startup構造中加入如下代碼

        public Startup()
        {
            Log.Logger = new LoggerConfiguration()
                .Enrich.FromLogContext()
                .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/"))
                {
                    AutoRegisterTemplate = true,
                })
                .CreateLogger();
        }

在Configure方法中加入loggerFactory.AddSerilog();

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //添加Serilog
            loggerFactory.AddSerilog();

            app.UseMvc();
        }

 

至此基礎配置已經完成可以調用了

調用代碼:

[Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
      
        ILogger<ValuesController> _logger;
        public ValuesController(ILogger<ValuesController> logger)
        {
            _logger = logger;
        }

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            _logger.LogInformation("321321");
            return new string[] { "value1", "value2" };
        }

項目運行后在Kibana中查看即可,Es中的index規則為:logstash-{yyyy.mm.dd}   例:logstash-2019.12.13

 

另外為了防止es鏈接可能出現斷連等情況可以改寫WriteTo.Elasticsearch為如下代碼,在連接出現問題時,將日志寫入本地文件

          Log.Logger = new LoggerConfiguration()
                .Enrich.FromLogContext()
                .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/"))
                {
                    AutoRegisterTemplate = true
                    FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
                    EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog |
                                       EmitEventFailureHandling.WriteToFailureSink |
                                       EmitEventFailureHandling.RaiseCallback,
                    FailureSink = new FileSink("./failures.txt", new JsonFormatter(), null)
                })
                .Enrich.WithProperty("AppName","WebApp1")
                .CreateLogger();

 

可以格式化一下控制台輸出的日志格式,讓閱讀起來輕松一點

.WriteTo.Console(new ElasticsearchJsonFormatter())

  

最后就是將配置相關的代碼遷移到配置文件中,創建部分代碼進行封裝,基礎的搭建就完成了。

 

參考:

https://www.humankode.com/asp-net-core/logging-with-elasticsearch-kibana-asp-net-core-and-docker

https://www.cnblogs.com/Leo_wl/p/10943285.html

https://github.com/serilog/serilog-sinks-elasticsearch

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM