簡體   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