.net core Serilog + Elk(Elasticsearch、Logstash、Kibana) 部署Linux及使用
部署
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进行匹配对应的索引,查看日志