.Net Core 5 使用 Serilog记录日志并输出至ElasticSearch

.Net Core 5 使用 Serilog记录日志并输出至ElasticSearch,第1张

.Net Core 5 使用 Serilog记录日志并输出至ElasticSearch

.Net Core 5项目中日志组件Serilog将日志信息输出到ElasticSearch,然后可以在Kibana里查看。这个是比较常见的 *** 作。今天就来讲解下具体的代码实现。

前提:搭建好elk相关应用。

一、 代码实现

1、Nuget添加包:

Serilog.AspNetCoreSerilog.Extensions.LoggingSerilog.Sinks.Elasticsearch

2、Program里添加代码:

using Serilog;using Serilog.Sinks.Elasticsearch;
   public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) =>
            {
                config
                    .MinimumLevel.Debug()
                    .Enrich.FromLogContext()
                    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://121.12.13.28:9200"))
                    {
                        IndexFormat = "muxue-{0:yyyy.MM}",
                        EmitEventFailure = EmitEventFailureHandling.RaiseCallback,
                        FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
                        AutoRegisterTemplate = true,
                        AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
                        //ModifyConnectionSettings =
                        //    conn =>
                        //    {
                        //        conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true);
                        //        conn.BasicAuthentication("elastic", "U3G44HpM33316TyV74");

                        //        return conn;
                        //    }
                    })
                    .WriteTo.Console();
            })

                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup();
                });
    }

  •  Entich.FromLogContext 这里的作用将一些环境信息写入日志中 

  • new ElasticsearchSinkOptions设置了ES的地址;

  • IndexFormat 默认是到天(logstash-{0:yyyy.MM.dd}),我修改成到月。不同IndexFormat的日志会存储在不同索引中 ;

  • EmitEventFailure 设置了当失败时调用FailureCallback 

  • ModifyConnectionSettings这里需要设置了2个地方,一个是忽略证书,一个是设置了 BasicAuthentioncation,也就是账号密码 。若没有设置密码,则无需要配置。

这里需要动态配置的值,可以放配置文件里。

3、记录日志:​​​​​​​

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : Controllerbase
    {
       

        private readonly ILogger _logger;

        public WeatherForecastController(ILogger logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public string Get()
        {


            _logger.LogInformation("我是info日志");

            try
            {
                int xx = 0;
                int y = xx / xx;
            }
            catch (Exception ex)
            {

                _logger.LogError(ex, $"出现异常日志:{ex.Message}");
            }



            return "ok";
        }
    }

4、在Kibana中查看 

4.1创建索引

若该索引没有创建,则需要创建一下;若已创建好,则不需要该 *** 作。

路径:Stack Management--》Index Patterns--》Create index pattern

选择Index patterns选项卡,点击Create Index patterns d出如下界面 。

(1)输入我们代码里设置的IndexFormat 值,如muxue-*作为 Index pattern name,这里我们使用了通配符。输入的同时,右边也会自动筛选出系统里已存在的数据,若这里出不来数据,则说明代码有问题。

(2)Time fieId选择了@timestamp,然后选择Create index pattern按钮。 

4.2查看日志

 选择Kibana左侧菜单中的Discover。 

选择刚才我们创建了muxue-*


右侧就有详细的日志记录。 

二、代码封装成组件

为了让业务项目代码更加简洁,我们一般将该代码封装成一个公共组件;可以供多个项目共同使用,并且后期的组件修改升级,业务代码只需要升级组件版本即可,而无需关注代码细节。

1、将serilog的3个引用添加:

2、创建一个静态类:

     /// 
    /// Serilog 日志拓展
    /// 
    public static class SerilogHostingExtensions
    {
  
        /// 
        /// 添加默认日志拓展-1
        /// 
        /// 
        /// 
        /// IWebHostBuilder
        public static IWebHostBuilder UseSerilogDefault(this IWebHostBuilder builder)
        {
            builder.UseSerilog((context, config) =>
            {
                string WriteToname = context.Configuration.GetSection("Serilog:WriteTo:0:Name").Value;
                if (string.IsNullOrWhiteSpace(WriteToName) || WriteToname != "Elasticsearch")
                {
                    config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{newline}{Exception}")
                      .WriteTo.File(Path.Combine(AppContext.baseDirectory, "logs", "application.log"), LogEventLevel.Verbose, rollingInterval: RollingInterval.Day, retainedFileCountLimit: null, encoding: Encoding.UTF8);
                }
                else
                {
                    var esAgr = context.Configuration.GetSection("Serilog:WriteTo:0:Args");
                    string esUri = esAgr.GetSection("nodeUris").Value;
                    string indexFormat = esAgr.GetSection("indexFormat").Value;


                    config
                   .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                   .MinimumLevel.Override("System", LogEventLevel.Warning)
                    .MinimumLevel.Debug()
                   .Enrich.FromLogContext()
                   .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esUri))
                   {
                       IndexFormat = indexFormat,
                       EmitEventFailure = EmitEventFailureHandling.RaiseCallback,
                       FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
                       AutoRegisterTemplate = true,
                       AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
                       //ModifyConnectionSettings =
                       //    conn =>
                       //    {
                       //        conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true);
                       //        conn.BasicAuthentication("elastic", "U3G44HpMwQv3Y5tq916TyV74");

                       //        return conn;
                       //    }
                   })
                   .WriteTo.Console();
                }

            });




            return builder;
        }

        /// 
        /// 添加默认日志拓展-2
        /// 
        /// 
        /// 
        /// 
        public static IHostBuilder UseSerilogDefault(this IHostBuilder builder)
        {

            builder.UseSerilog((context, config) =>
            {
                string WriteToname = context.Configuration.GetSection("Serilog:WriteTo:0:Name").Value;
                if (string.IsNullOrWhiteSpace(WriteToName) || WriteToname != "Elasticsearch")
                {
                    config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{newline}{Exception}")
                      .WriteTo.File(Path.Combine(AppContext.baseDirectory, "logs", "application.log"), LogEventLevel.Verbose, rollingInterval: RollingInterval.Day, retainedFileCountLimit: null, encoding: Encoding.UTF8);
                }
                else
                {
                    var esAgr = context.Configuration.GetSection("Serilog:WriteTo:0:Args");
                    string esUri = esAgr.GetSection("nodeUris").Value;
                    string indexFormat = esAgr.GetSection("indexFormat").Value;


                    config
                   .MinimumLevel.Debug()
                   .Enrich.FromLogContext()
                   .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esUri))
                   {
                       IndexFormat = indexFormat,
                       EmitEventFailure = EmitEventFailureHandling.RaiseCallback,
                       FailureCallback = e => Console.WriteLine("Unable to submit event " + e.MessageTemplate),
                       AutoRegisterTemplate = true,
                       AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
                       //ModifyConnectionSettings =
                       //    conn =>
                       //    {
                       //        conn.ServerCertificatevalidationCallback((source, certificate, chain, sslPolicyErrors) => true);
                       //        conn.BasicAuthentication("elastic", "U3G44HpMwQv3Y5tq916TyV74");

                       //        return conn;
                       //    }
                   })
                   .WriteTo.Console();
                }

            });




            return builder;
        }
    }

将一些值放配置文件里。

3、配置文件内容:

{

 "Serilog": {
    "WriteTo": [
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "http://110.120.130.140:9200/",
          "indexFormat": "muxue-api-{0:yyyy.MM}"
        }
      }
    ]
  }
  }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5688413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存