Amazon-Ec2

如何從 AWS EC2 和 Docker 容器中檢索日誌以防故障?

  • December 12, 2017

目前,我們有以下設置:

多台 AWS EC2 機器,一些執行 Docker 容器,一些沒有 docker。為了檢索系統日誌、網路伺服器日誌 (Apache) 和應用程序日誌,我們在 EC2 實例上執行了一個 Fluentd 代理 (td-agent)。這些將錯誤日誌消息轉發到集中式 Fluentd 伺服器(日誌聚合器),然後再將它們發送到 Graylog。對於訪問日誌,實例上的所有 td-agents 將它們直接轉發到 AWS Kinesis Firehose,後者每 5 分鐘將這些日誌儲存在 S3 上(緩衝),並且可供 AWS Athena 搜尋。Docker 容器上的訪問日誌寫入標準輸出,錯誤日誌寫入標準錯誤。fluentd 的 docker logging 驅動程序用於將它們轉發到安裝在相應主機上的 td-agent。

現在,此設置存在一些問題:

  1. 無法實時查看訪問日誌(例如用於開發人員調試目的)
  2. td-agents 的記憶體/緩沖在高負載時可能會成為問題
  3. 當日誌聚合器或 td-agents 停止服務時,td-agents 或 Docker 容器的記憶體/緩衝可能會成為問題

由於價格和其他原因,我們沒有使用 CloudWatch Logs。使用真實的日誌文件也意味著我們需要定期輪換它們,注意磁碟空間等。最後一點可以通過使用 RAM 磁碟或單獨的驅動器來解決。但這並不能解決固定大小的記憶體/緩衝區可能會變滿並阻塞傳入日誌的實際問題。

解決這個問題有什麼更好的方法?有沒有關於記錄 Docker 容器的最佳實踐?

萬一其他人在這裡絆倒並想知道該怎麼做,這是我們的選擇以及我們最終承諾的內容:

  1. Docker 的 fluentd 日誌驅動程序:本來很棒,但你不能輕易限製文件輸出外掛的大小。只有緩衝區可見的黑客攻擊也沒有成功。
  2. Docker 的 json-file 日誌驅動程序:您可以限制日誌文件的數量以及它們的大小。它們很容易被 看到docker logs,但它們僅適用於 root 使用者它們不應該被自動化系統跟踪。相信我,我試過了,但不值得。一些缺點包括不支持tag指令、td-agent 至少需要 30 秒才能使用新容器的日誌文件等等。
  3. Docker 的 Syslog 日誌驅動程序:這就是我們現在使用的。它支持tag,可以被其他使用者查看和 grep 以獲得實時概覽,並且與 td-agent 配合得非常好。缺點:增加了另一個服務和成本。不支持docker logs。此外,速率限制等可能存在問題。

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