一千萬個為什麽

搜索

如何在Docker中有多個日誌流



我們有一個應用程序將三種日誌寫入三個單獨的文件:訪問日誌,通用應用程序日誌和系統日誌。這些日誌的格式(和目的)是非常不同的。我們有單獨的logforwarders將它們分別發送到我們的集中式日誌記錄系統。

根據將日誌視為事件流的原則,我們正在考慮從使用文件轉移到標準輸出。雖然我們知道這種方法的一些好處,但這也意味著我們會得到不同格式日誌的合並流,在我們將它們發送到我們的中央系統(Kibana/Splunk)之前,我們需要再次分割它們/等),或者在那裏。

我們想知道是否有任何工具或建議如何處理這種情況。

轉載註明原文: 如何在Docker中有多個日誌流

一共有 2 個回答:

我仍然在尋找自己的合並/分裂方法,但同時這種由Kubernetes文檔推薦的方法看起來像是一個合理的解決方案:為每個單獨的日誌使用一個邊車容器

“邊車”是任何碼頭集裝箱,您可以與另一個碼頭集裝箱一起使用,以某種方式使用它。在這種情況下,對於您的三個日誌中的每一個,您都將擁有一個單獨的容器,用於掃描或追蹤日誌並將其輸出到stdout。

這樣,每個日誌邊車容器都有自己的stdout自己的docker-log。像這樣分開,您可以使用標準碼頭工具(和kubernetes等)來分離或聚合。以下是Kubernetes網頁的說明:

這種方法允許您將多個日誌流與應用程序的不同部分分開,其中一些日誌流可能不支持寫入stdout或stderr。重定向日誌背後的邏輯是最小的,所以它不是一個重大的開銷。此外,由於stdout和stderr由kubelet處理,因此可以使用內置工具(如kubectl日誌)。

The "separate log streams" stem from the built-in tagging that docker applies to logs from different containers, described in the docker documentation here:

標記日誌選項指定如何格式化標識該標記的標記   容器的日誌消息。默認情況下,系統使用前12個   容器ID的字符。要覆蓋此行為,請指定一個   標簽選項

將它們合並為一條流以便稍後拆分它們的想法聽起來很痛苦。我自己沒有理由這樣做,但是這裏是我開始的地方:

  • 運行docker容器時,請創建一個卷,以便從主機查看/運送日誌。
  • 使用類似 remote_syslog2 的方式將日誌發送到日誌收集器

在主機上進行一些設置時,感覺有點不夠優雅,但是如果你使用了一些可以運行劇本的東西,並在部署到盒子時進行設置,它不應該太壞。