Logstash

匯總新舊事件的統計數據

  • June 24, 2017

我們希望將 CDN 日誌提供給 Graphite,並在其中找到匯總數據(不同 HTTP 狀態程式碼的比率、平均響應大小、平均記憶體命中率等)

然而,日誌只是偶爾上傳給我們,有時甚至是亂序的——偶爾,早上的日誌可以在晚上上傳,也就是下午的日誌上傳和處理後的幾個小時。此外,因為 CDN(顯然)有多個伺服器和數據中心,不同的日誌可以覆蓋重疊的時間段。

這意味著,任何聚合器都需要保持對所有早期統計數據的訪問,以便在處理新日誌時能夠增強聚合……

什麼——如果有的話——可以做到這一點?以及如何配置 logstash 來輸入它?謝謝!

眾所周知,這是一個複雜的問題。你在你的問題中標記了 Logstash,所以我假設你有這個。

攝取日誌是 Logstash 所做的。它有一個file {}輸入外掛

input {
 file {
   path => [ '/opt/export/cdn_logs/*.csv'
   tags => [ 'cdnlogs' ]
 }
}

一個csv {}過濾器來簡化 CSV 數據的攝取。

filter {
 if 'cdnlogs' in [tags] {
   csv {
     source => "message"
     columns => [
       'cdndate',
       'host_server',
       [...]
       'response_time' ]
   }
 }
}

如果您沒有 CSV 數據,也許這些行是看起來相當正常的 Apache 格式,一切都不會失去。您可能需要花時間與 grok 相處。那是它自己的事。

只要您注意保留時間戳並且不使用明顯保留它們的statsd ,日期排序就不是問題。如果您還沒有這樣做,Logstash 可以獲取日誌文件中的日期並將其作為事件的日期/時間戳。

filter {
 date {
   match => [ "cdndate", "ISO8601" ]
 }
}

這將日誌行的日期/時間戳作為事件的時間戳。酷,現在把它變成有用的東西。

Logstash 的庫存數據儲存是 elasticsearch Elastic(該公司)正忙於嘗試將其作為與 InfluxDB 或 OpenTSDB 等專用工具一樣好的時間序列數據儲存。可以,儘管根據我的經驗,專用的性能更好。所有這些都可以,假設你輸入正確,以正確的順序儲存亂序事件,以便以後的查詢可以吸收新資訊。

Logstash的graphite {}輸出將保留時間戳,如果您願意,您可以使用石墨作為備份儲存。

influxdb {}存在和輸出外掛,opentsdb {}並將您的數據放入真正的時間序列數據庫。

從那裡,近期數據的聚合/匯總(距您的解釋幾天)應在查詢時完成。像grafana這樣的工具可以在其中幾個數據儲存前面,並使顯示更容易。一旦您越過了日誌到達的風險區域,您就可以執行稍後的 ETL 過程以基於完整的數據集生成數據庫內聚合/匯總。然後根據需要清除完整詳細日誌。

簡而言之,方法:

  1. 使用 Logstash 攝取文件。
  2. 利用過濾從 CDN 日誌文件中提取欄位。
  3. 使用過濾器date {}日誌的時間戳拉到事件的時間戳中。
  4. 將數據導出到某物(彈性、石墨或其他時間序列數據庫)
  5. 顯示工具使用實時聚合查詢向消費者顯示數據,至少是近期數據。
  6. 一段時間後,可能是幾天后,腳本或其他自動化過程會生成聚合併將它們輸入到數據儲存中。
  7. 更多時間後,將清除全解析度數據,只留下聚合數據。

引用自:https://serverfault.com/questions/857403