繁体   English   中英

使用 Logstash 可靠性和可用性记录到 elasticsearch,处理丢失的日志?

[英]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 发送日志

Http输入监听端口8080

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM