Docker 日志最佳實踐

當運行在?docker?容器中的應用程序打印日志時,日志會輸出到標準輸出流 stdout 和標準錯誤流 stderr。容器日志驅動可以訪問這些流,并將日志發送到文件、本機運行的日志收集器或遠端的日志服務端點(endpoint)。本文將介紹選擇不同的日志驅動及配置對容器應用的性能和穩定性帶來的影響,以及推薦最能滿足日志記錄需求和性能的日志驅動及配置。

選擇日志驅動

Docker 提供了若干內置的日志驅動,不同的日志驅動會把日志分發到不同的地方,每個容器只能只能指定一種日志驅動。

Docker?使用?json-file 作為默認日志驅動,該驅動把日志以 json 的格式寫入宿主機指定文件:

/var/lib/docker/containers/{CONTAINER_ID}-json.log

下面是由 hello world 鏡像啟動的容器創建的 json?日志實例:

{"log":"Hello from Docker!\n","stream":"stdout","time":"2022-05-29T22:51:31.549390877Z"}
{"log":"This message shows that your installation appears to be working correctly.\n","stream":"stdout","time":"2022-05-29T22:51:31.549396749Z"}

也可以通過命令行直接查看日志:

docker?logs?<CONTAINER_ID>?or?docker?logs?<CONTAINER_NAME>
Hello from Docker!
This message shows that your installation appears to be working correctly.

其中,docker?提供了以下內置日志驅動:

  • none

禁用日志,且 docker logs 指令不返回任何內容。

  • local

保存日志內容到本地文件并對內容進行壓縮。

  • json-file

以 json 格式保存日志內容到本地文件,默認日志驅動。

  • syslog

保存日志內容到?syslog,syslog daemon 必須運行在宿主機上。

  • journald

保存日志內容到?journald,journald?daemon?必須運行在宿主機上。

  • gelf

保存日志內容到 GELF - Graylog Extended Log Format?端點,如 Graylog 和 Logstash。

  • fluentd

保存日志內容到?fluentd,fluentd?daemon?必須運行在宿主機上。

  • awslogs

保存日志內容到 Amazon CloudWatch。

  • splunk

保存日志內容到?splunk。

  • etwlogs

保存日志內容到?ETW - Event Tracing for Windows,只能在 Windows 平臺上使用。

  • gcplogs

保存日志內容到 GCP - Google Cloud Platform。

  • logentries

保存日志內容到?Rapid7 Logentries。

配置日志驅動

Docker 容器默認使用?json-file 日志驅動,大部分情況下,建議直接使用該驅動。如果你的應用場景確實需要使用其它驅動,可以在 docker run 指令中使用?--log-driver?選項來覆蓋默認驅動,以下是使用?fluntd?作為日志驅動的示例:

docker?run?--log-driver?fluentd?httpd:latest

也可以通過修改?daemon.json?來配置日志驅動,以下是使用?fluntd?作為日志驅動的示例:

{"log-driver": "fluentd","log-opts": {"fluentd-address": "fluentd-ip:fluentd-port"}
}

重啟 docker 使上述配置生效,后續創建的容器都將使用?fluentd 作為日志驅動,并把日志發送到指定的 fluentd address。

日志分發模式

無論選擇了什么日志驅動,都可以指定日志的分發模式:阻塞或非阻塞。

阻塞模式

阻塞模式是日志分發的默認模式,在該模式下,日志每次發送時會阻塞應用程序,以保證日志能正常到達指定位置,這會增加應用程序的處理延遲,降低應用程序的性能。如果日志驅動一直處于繁忙,容器會延遲應用程序的其他任務,直到日志傳輸完畢。

阻塞模式對應用程序性能的潛在影響取決于選擇的日志驅動。例如,json-file 日志驅動日志寫入速度非常快,并且寫入的是本地文件,所以不太可能出現阻塞并導致延遲。相反的,gcplogs?和?awslogs?這些需要打開遠程連接的日志驅動,很可能會出現長時間的阻塞,并對應用程序帶來明顯的延遲。

非阻塞模式

在非阻塞模式下,容器首先把日志寫入內存環形緩沖區,直到日志驅動可以處理它們為止。即使日志驅動很忙,容器也可以立即將日志輸出到緩沖區,并繼續執行應用程序。這確保了大量日志活動不會影響容器中運行的應用程序的性能。

與阻塞模式相比,非阻塞模式不能保證日志能正常到達指定位置。如果應用程序產生日志的速度快于日志驅動處理日志的速度,環形緩沖區的內存將會耗盡。如果發生這種情況,緩沖區較早的 日志將被刪除,然后才能傳遞給日志驅動,造成日志丟失。可以通過?max-buffer-size?選項來設置環形緩沖區的大小,max-buffer-size?的默認值為?1MB。如果宿主機有足夠內存的話,

配置分發模式

阻塞模式是日志分發的默認模式,可以在創建容器時使用--log-opt選項來設置非阻塞模式:

docker?run?--log-opt?mode=non-blocking?httpd:latest

也可以通過修改?daemon.json?來配置分發模式:

{"log-driver": "fluentd","log-opts": {"fluentd-address": "fluentd-ip:fluentd-port","mode": "non-blocking"}
}

選擇適合的日志驅動及分發模式

大部分場景下,建議使用阻塞模式 +?json-file,日志寫入本地文件速度非常快,在阻塞模式下能夠捕獲所有日志,但不會降低應用程序性能。

可以使用日志收集 agent,如 fluentd/fluent-bit?來 tail 本地日志文件,并將日志轉發到日志中心。json 格式的日志易于解析,可以按屬性篩選日志,識別日志趨勢并作相應警報,以及對容器應用進行分析。

阻塞模式 +?json-file?雖然能滿足大部分應用場景,但在某些情況下,可能需要考慮其它的日志驅動及分發模式組合。

磁盤密集型應用

如果應用程序產生大量日志并頻繁執行 I/O 操作,請考慮使用非阻塞模式 +?json-file。該組合可保持應用程序的性能,同時仍可提供可靠的結構化日志記錄。將日志寫入本地存儲很快,環形緩沖區不太可能被填滿。如果不需要支持記錄峰值時的日志(此時可能會填滿環形緩沖區),那么非阻塞模式 +?json-file 可以捕獲所有的日志,而不會中斷應用程序。

不能使用本地日志的內存密集型應用

如果應用程序本身很需要內存資源,并且日志不能存放在本地,需要使用?gcplogs 或 awslogs 等驅動把日志發送到遠端時,應考慮阻塞模式。因為如果出現網絡阻塞時,已無足夠內存可分配給環形緩沖區。

雖然使用阻塞模式可以確保捕獲所有日志,但通常不建議在阻塞模式下使用 json-file 以外的日志驅動,因為應用程序的性能可能會受到影響。

對于日志無法存放到本地,但性能要求又高于日志可靠性的應用程序,建議為環形緩沖區提供足夠的內存,并使用非阻塞模式。這樣可以確保應用程序性能不會受到日志記錄的影響,同時也為捕獲主要日志提供了足夠的空間。

參考總結

以上就是本文希望分享的內容,如果大家有什么問題,歡迎在公眾號 - 跬步之巔留言交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之提示A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

1 問題 編譯項目的時候提示錯誤如下 A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution 2 原因 有2次我寫room數據庫的時候都提示這個 ColumnInfo(name "isAddBookmark")var isAddBookmark falseColumnInfo(name "…

一個獲取a標簽傳值的函數

//獲取url查詢參數 var getUrlParams function () {var href"",params;return function (key,url) {if(url) {href url;params null;} else if(!url && !href) href window.location;//console.log(href);if(!params) {params {};var search href.sea…

【大地信】新時代GIS發展趨勢與未來展望

一、你必須知道的國內外知名學者 1. RogerTomlinson(羅杰湯姆林森)---GIS之父 Roger Tomlinson從1963年開始創建世界上第一個地理信息系統,即加拿大地理信息系統(CGIS)。因此,Tomlinson被譽為地理信息系統之父。 RogerTomlinson(1933.12---2014.2.9) 2. Michael Fran…

Python3.6學習筆記(二)

Python 的高級特性 切片 對于指定索引范圍取值的操作&#xff0c;Python提供了slice方法&#xff0c;類似于Excel中數據透視表的切片器。 >>> L [Michael, Sarah, Tracy, Bob, Jack’] #聲明一個List&#xff0c;取前三個值 >>> L[0:3] #表示從0開始&…

小程序獲取頭像試試水 02《 程序員變現指南之 微信QQ 小程序 真的零基礎開發寶典》

本系列教程是針對粉絲的變現教程&#xff0c;還不是粉絲的可以關注我并且到社區&#xff1a;https://bbs.csdn.net/topics/603436232 進行打卡&#xff0c;不是老粉的也可以獲取最終的技術變現學習&#xff0c;最終還有詳細的變現教程等你來。 前言 《 程序員變現指南之 微信…

VNX NETAPP NAS 備份恢復

做多少次快照的時間是自定義 的&#xff0c;例如可以每隔4小時做一次。 例如有A&#xff0c;B&#xff0c;C&#xff0c;D四個文件。 1&#xff09;第一次快照&#xff08;COW&#xff09;&#xff1a; 快照是瞬時的&#xff0c;拍照時候創建了一個快照空間&#xff0c;例如20%…

Git之cherry-pick命令

1 需求 有時需要把某遠程分支(比如dev分支)的某一次提交合并到另一遠程分支(比如master分支),這就需要用到git cherry-pick命令。 比如我們現在有0.1分支和0.2分支,我在0.1分支上提交了最后一次代碼,推上去了,現在需要合并這次提交到0.2 2 操作步驟 我們先到0.1分支…

【空間數據庫】時空數據庫,時態數據模型詳解

一、時態空間數據庫概述 現實世界的數據不僅與空間相關,而且與時間相關。在許多應用領域,如環境監測、搶險救災、交通管理、醫療救援等,相關數據隨著時間變化而變化,稱之為時態數據。很多空間數據庫應用都涉及時態數據,這些應用不僅需要存取空間數據庫的當前狀態,也需要存…

輸出日志實例改成用Spring的AOP來實現

1.采用Interception Around通知的形式實現 Interception Around通知會在Join Point的前后執行&#xff0c;實現Interception Around通知的類需要實現接口MethodInterceptor。其實現思路是&#xff1a; 1&#xff09;首先實現接口MethodInterceptor&#xff0c;在Invoke()方法里…

基于.NetCore開發博客項目 StarBlog - (9) 圖片批量導入

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

zookeeper 入門講解實例 轉

轉 http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.htmlzookeeper使用和原理探究&#xff08;一&#xff09;zookeeper介紹zookeeper是一個為分布式應用提供一致性服務的軟件&#xff0c;它是開源的Hadoop項目中的一個子項目&#xff0c;并且根據google發表的&l…

小程序仿微信發現頁 03《 程序員變現指南之 微信QQ 小程序 真的零基礎開發寶典》

本系列教程是針對粉絲的變現教程&#xff0c;還不是粉絲的可以關注我并且到社區&#xff1a;https://bbs.csdn.net/topics/603436232 進行打卡&#xff0c;不是老粉的也可以獲取最終的技術變現學習&#xff0c;最終還有詳細的變現教程等你來。 前言 《 程序員變現指南之 微信…

Silverlight與WCF之間的通信(4)silverlight以net.tcp方式調用console上寄宿的wcf服務

&#xff08;由于最近是針對一個demo進行的研究&#xff0c;在之前公開過代碼結構&#xff0c;這里只是對需要改動的地方加以說明&#xff09; WCF4.0使得編寫wcf服務不再那么復雜&#xff0c;去掉了許多的配置信息&#xff0c;客戶端只需要一個服務地址&#xff0c;便可在系統…

【空間數據庫】空間數據庫引擎(Spatial DataBase Engine)ArcSDE詳解

一、空間數據庫引擎概述 空間數據庫引擎的概念最早由ESRI提出。ESRI對SDE的定義是:從空間數據管理的角度看,SDE是一個連續的空間數據模型,借助這一模型,我們可以將空間數據加人到關系數據庫系統( RDBMS)中去。 SDE可以理解為基于特定的空間數據模型,在特定的數據存儲、數…

Git之提示There is no tracking information for the current branch.

1 問題 我項目比如是0.2分支&#xff0c;我需要修改項目的git地址&#xff0c;然后再pull新的代碼 1&#xff09;修改github地址&#xff08;讀者可以忽略&#xff09; 1.git remote 查看所有遠程倉庫 2.git remote rm origin 刪除之前的版本庫 3.git remote add origin htt…

Maui學習之路(一)--Windows窗體設置

Maui的學習之路作為 Maui的先行者&#xff0c;我有話要說&#xff0c;微軟你為了讓我成為牛 B 的程序員真的是煞費苦心&#xff0c;你一定是覺得我不夠牛逼所以針對我&#xff0c;存心想氣死我。好了廢話不多說&#xff0c;Maui現在也算是正式發布了&#xff0c;我有點想用它來…

Git 常用命令大全

Git 是一個很強大的分布式版本控制系統。它不但適用于管理大型開源軟件的源代碼&#xff0c;管理私人的文檔和源代碼也有很多優勢。 Git常用操作命令&#xff1a; 1) 遠程倉庫相關命令 檢出倉庫&#xff1a;$ git clone git://github.com/jquery/jquery.git 查看遠程倉庫&#…

為什么本地使用js或jquery操作cookie在谷歌瀏覽器chrome中不生效?

2019獨角獸企業重金招聘Python工程師標準>>> 為什么本地使用js或jquery操作cookie在谷歌瀏覽器chrome中不生效&#xff1f;新手學習js或jquery時&#xff0c;一般是在本地調試&#xff08;前端學習一般用不到服務器端&#xff09;&#xff0c;當學習到cookie一節時&…

全解小程序猜數字游戲 04《 程序員變現指南之 微信QQ 小程序 真的零基礎開發寶典》

本系列教程是針對粉絲的變現教程&#xff0c;還不是粉絲的可以關注我并且到社區&#xff1a;https://bbs.csdn.net/topics/603436232 進行打卡&#xff0c;不是老粉的也可以獲取最終的技術變現學習&#xff0c;最終還有詳細的變現教程等你來。 社區有獎勵 下面有投票 本文也…

Android之解決主頁面Activity監聽fragment退出問題(由NavHostFragment和RxFragment一起管理fragment)

1、 問題 app里面目前主頁面是一個activity,然后部分fragment是由NavHostFragment管理,當splash、login等頁面也放在navigation時,按手機的返回鍵這些頁面只能一頁頁回退,因為設置了 app:defaultNavHost="true" 并不能在某個頁面例如splash、login按返回鍵時退…