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.mzph.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按返回键时退…