.net core Serilog + Elk(Elasticsearch、Logstash、Kibana) 部署Linux及使用

发布时间 2023-11-15 16:36:45作者: Joni是只狗

部署

Elasticsearch 官方地址 ,这里只需要装ES 和Kibana 。 Serilog 会直接把数据写入ES,绕开了 Logstash,所以不需要装Logstash

Elasticsearch 部署

1. 方便后面集群通信,先创建网络

docker network create elastic

2. 拉取镜像。

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.11.1

3. 启动容器

docker run --name es01 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m"  --net elastic -p 9200:9200 -itd -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.11.1

注意这里没有挂载,正常生产环境应该把config,data,plugin全部挂载出来

启动后默认会是https的,如果要关闭,修改elasticsearch.yml中一下配置,版本变化后可能配置不一样

# 如果之前启用了HTTPS,可能会有类似以下的设置
xpack.security.http.ssl.enabled: false

启动成功后查看日志(docker logs  [容器名称]),会找到生产的密码,证书和token等信息,保存到本地,方便使用

如果后期忘记了密码和token,可以重新生成

重新生成token: docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
重新生成密码:docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elasticx

会生成ca证书,这里可以考到本地计算机方便使用

docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .

如果需要部署集群,请查看上面的官方文档

启动成功后输入地址:https://ip:9200  。这里是https忽略浏览器的安全校验 ,输入 账号:elastic  密码:【上面启动生成密码】。成功后如下所示

Kibana 部署

1. 拉取 Kibana Docker 镜像。

docker pull docker.elastic.co/kibana/kibana:8.11.0

2. 启动 Kibana 容器

docker run --name kib01 --net elastic -p 5601:5601 -itd docker.elastic.co/kibana/kibana:8.11.0

这里生产环境需要把kibana.yml 挂载出来

访问 http://ip:5601 。最开始初始化需要输入Es启动时生成的token。注意,上面生成的token会有过期时间,如果过期了请重新生成token

输入后,查看 kibana 日志,会生成一个验证码,然后输入进去就行了 

 

输入ES账号密码进行登录

代码实践

1. 引入nuget包

Serilog.AspNetCore
Serilog.Sinks.Elasticsearch

###以下配置是为了扩展其他的,只需要上面两个包就行了
Serilog.Settings.Configuration
Serilog.Sinks.Console
Serilog.Sinks.Seq

2. 修改program.cs 

builder.Host.UseSerilog();
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()   //最小日志记录等级
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)    //指定程序集最小记录级别
    .MinimumLevel.Override("System", LogEventLevel.Warning)
    .ReadFrom.Configuration(Configuration)
    .Enrich.FromLogContext()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("https://192.168.0.236:9200"))
    {
        //传送到ES中失败的日志会进入这里
        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), //如果日志发送不到ES则存放在这里

        MinimumLogEventLevel = LogEventLevel.Information,
        ModifyConnectionSettings = conn =>
                conn.ServerCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) => true) // 禁用证书验证
            .ServerCertificateValidationCallback((sender, certificate, chain, errors) => true) // 禁用证书验证
            .ServerCertificateValidationCallback((sender, certificate, chain, policyErrors) => true) // 禁用证书验证
            .BasicAuthentication("elastic", "FyuSpCJMd2sX2iq27lKv"), // 如果启用了基本身份验证,这里要配置密码
            //.CertificateFingerprint("94fd0d932dc79ed50523612ecc49225c91dde29f33c697b92f05357df6ace879"),
            //.ClientCertificate("./certs/http_ca.crt"),// 如果需要客户端证书
        IndexFormat = "physicaltest-{0:yyyy.MM.dd}",
        //自动注册模板
        AutoRegisterTemplate = true,
        //模板类型
        AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv6,
        //自定义模板名称
        //AutoRegisterTemplate = false,    
        //CustomFormatter = new ElasticsearchJsonFormatter(renderMessage: true),
        //TemplateName="测试",
    })
    .CreateLogger();

注意:如果开启了身份验证,一定要设置账号密码才能访问,本地使用了https+ip的形式,要禁用证书验证,否则数据发送不到ES上面,会进入FailureCallback 

3. 测试代码

 private IConfiguration _configuration;
        private readonly ILogger<ValuesController> _logger;
        public ValuesController(IConfiguration configuration, ILogger<ValuesController> logger)
        {
            _configuration = configuration;
            _logger = logger;
        }
        /// <summary>
        /// 测试日志
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        [HttpGet("GetTest")]
        public IActionResult GetTest()
        {
            _logger.LogError("这是一条测试消息Erro");
            Log.Error("这是一条测试错误日志");
            return Ok();
        }

  

4. 查看效果

如果程序正常,会在界面上会自动创建索引在Stack Management =》Index Management 中查看索引,如果没有创建,看数据是否传到了ES中

 

在Discover中创建data view进行匹配对应的索引,查看日志