[英]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.