Docker

如何將應用程序日誌從 Docker 容器轉發到 ELK

  • March 21, 2017

我正在嘗試將日誌集中在使用多種應用程序技術(Java、Rails 和各種 DB)的環境中。

我們希望開發人員使用 Docker Compose 建構堆棧,但我們希望他們參考中央日誌源 (ELK) 來調試問題,而不是嘗試打開 shell 來執行 Docker 容器。

應用程序都寫入文件系統而不是 STDOUT/STDERR,這刪除了與 Docker 日誌記錄驅動程序和 logspout 相關的所有選項。

我們所做的是將容器配置為讓 rsyslog 包含應用程序日誌文件,並將這些文件轉發到具有 syslog 輸入的 logstash。這適用於將日誌從 A 移動到 B,但是基於 syslog 輸入在 ELK 中管理多技術日誌是可怕的(例如,嘗試擷取多個 Java 堆棧跟踪或 MySQL 慢查詢)。

有一個更好的方法嗎?我是否應該在每個容器中執行 logstash,以便我可以將過濾器和編解碼器直接應用於日誌文件,這樣我就不必依賴 syslog 輸入?

是否有某種方法可以將 Docker 日誌記錄驅動程序與寫入文件系統的應用程序日誌文件一起使用?

最新版本的 Docker 支持將“GELF”格式的日誌傳輸到網路埠。Logstash 有一個 GELF 輸入。您可以在每個節點上執行 Logstash,並將節點上的所有 Docker 實例轉發給它。

作為 Logstash 輸入:https ://www.elastic.co/guide/en/logstash/current/plugins-inputs-gelf.html

gelf {
}

對於 Docker 輸出: https ://docs.docker.com/engine/admin/logging/overview/#gelf

$ docker run -dit \
            --log-driver=gelf \
            --log-opt gelf-address=udp://127.0.0.1:12201 \
            alpine sh

(gelf-address 來自容器外部,而不是內部)

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