.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进行匹配对应的索引,查看日志



浙公网安备 33010602011771号