[英]Logging to elasticsearch using Logstash reliability and availability, handling missing logs?
我正在关注关于 ELK 的这篇文章: 使用 ELK Stack 和 Serilog .NET Core 在微服务架构中构建日志系统,在这个架构中,serilog 记录到 Logstash,然后将 logstash 推送到 Elastic 搜索,如果无法访问弹性搜索或者如果logstash 服务已关闭或网络已关闭或系统已关闭,简而言之,我要去哪里,如何确保我的日志在所有情况下都不会丢失,日志也应该可以离线使用,我想首先存储在日志文件中,然后将日志从文件处理到弹性搜索,但是文件会在一段时间内增长,然后我必须注意没有重复的消息并且消息也需要删除,并且最重要的是在读写文件时没有死锁这种情况,请你帮我了解一下ELK是否照顾好,如果我使用fluend或fluentbit而不是logstash,它们会更好吗?
代码:
var log = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.Http("http://localhost:8080")
.CreateLogger();
while (true)
{
var customer = Customer.Generate();
log.Information("{@customer} registered", customer);
Thread.Sleep(1000);
}
output:
[13:56:02 INF] {"FirstName": "Lourdes", "LastName": "Kreiger", "SSNumber": "350-11-7869", "$type": "Customer"} registered
[13:56:03 INF] {"FirstName": "Desmond", "LastName": "Balistreri", "SSNumber": "929-58-1854", "$type": "Customer"} registered
...
使用 ELK 发送日志
input {
http {
#default host 0.0.0.0:8080
codec => json
}
}
# Separate the logs
filter {
split {
field => "events"
target => "e"
remove_field => "events"
}
}
# Send the logs to Elasticsearch
output {
elasticsearch {
hosts => "elasticsearch:9200"
index=>"customer-%{+xxxx.ww}"
}
}
您有两个可能导致数据丢失的主要故障点,logstash 和 elasticsearch 之间的通信以及您的服务和 logstash 之间的通信。
logstash 和 elasticsearch 之间的通信
当向 elasticsearch 发送数据时,默认情况下,logstash 在input
块和管道的filter
块之间使用 memory 队列,该队列用于在 logstash 无法与 Z18897DCFCE6A4E7AE68ZA3BAEED443 对话的情况下存储事件。
这个 memory 队列有1000 个事件的固定大小,因此如果每秒有很多事件,它并没有多大帮助。 您可以更改管道以使用持久队列,此队列将执行与内存队列相同的操作,但它会写入 logstash 服务器中的文件,您可以更改文件大小以存储更多事件。
如果持久化队列已满且 elasticsearch 仍处于关闭状态,logstash 将停止接受新事件,队列何时填满完全取决于队列的大小、事件的大小和事件的速率,但持久化队列是其中之一你可以做些什么来避免logstash和elasticsearch之间的数据丢失。
您的服务和 logstash 之间的通信
如果您的服务无法与 logstash 通信,那么您需要在其上实现一些逻辑以避免数据丢失。 如何做到这一点完全掌握在您的手中。
您可以复制 logstash 使用的持久队列并将未发送到 logstash 的事件写入文件,然后在 logstash 返回时重播这些事件。
这将添加许多您需要自己实现的额外内容。
备择方案
我想说最好的方法是将日志写入日志文件并使用filebeat将这些日志发送到logstash,甚至直接发送到elasticsearch,如果您不想在logstash中使用任何过滤器,filebeat可以自动重试发送在 output 服务的情况下,日志无法访问,它还跟踪已经发送或未发送的内容。
由于您使用的是 dotnet,因此您可以使用 log4net 进行日志记录,它会处理日志记录部分,并在达到某个指定大小时轮换您的日志。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.