当前位置: 首页 > news >正文

docker logs写入文件_Docker 日志的 10 大陷阱

Docker不仅改变了应用程序的部署方式,还改变了日志管理的工作流程。容器不但无需将日志写入文件,反而是将日志写入控制台(stdout /

stderr),然后Docker Logging Drivers将日志转发到目标。针对Docker

GitHub问题的检查很快会显示用户在处理Docker日志时遇到各种问题。使用Docker管理日志貌似有点棘手,且需要深入理解Docker

Logging Driver的实现和替代方法,以解决报告的问题。

那么,Docker日志的十大陷阱是什么?

首先,让我们从Docker Logging Drivers和选项的概述开始,将日志发送到集中式日志管理解决方案,如Elastic Stack(前身ELK Stack)或Sematext Cloud。

AAffA0nNPuCLAAAAAElFTkSuQmCC

在Docker的早期,容器日志只能通过Docker远程API,即通过“docker

logs”命令和一些高级的日志传送工具才能使用。之后,Docker引入日志驱动程序作为插件,以打开Docker与各种日志管理工具进行集成。这些日志驱动程序是作为docker守护进程中的二进制插件实现的。最近,插件体系结构得到了扩展,以便于运行日志驱动程序作为外部进程,不但可以注册为插件,还可以通过Unix套接字检索日志。目前,Docker二进制文件附带的日志记录驱动程序是二进制插件,但在不久的将来可能会发生变化。

Docker Logging

Drivers接收容器日志并将其转发到远程目标或文件。默认的日志驱动程序是“json-file”。它在本地磁盘上以JSON格式存储容器日志。Docker有一个用于日志记录驱动程序的插件体系结构,所以有插件可用于开源工具和商业工具:Journald – 将容器日志存储在系统日志中

Syslog Driver – 支持UDP,TCP,TLS

Fluentd- 支持TCP或Unix套接字连接到fluentd

Splunk - 将HTTP / HTTPS转发到Splunk服务器

Gelf - 将UDP日志转发到Graylog2

对于完整的日志管理解决方案,需要包含附加工具:

日志解析器来构造日志,通常是日志传送工具(fluentd,rsyslog,logstash,logagent等)的一部分

日志索引,可视化和警报:

为了将日志发送到其中一个后端,你可能需要选择一个支持所选日志管理解决方案的日志驱动程序或日志记录工具。如果你的工具需要Syslog输入,则可以选择Syslog驱动程序。

Docker日志的十大陷阱

1. Docker日志命令只在使用json-file日志驱动程序时可工作

默认的日志驱动程序“json-file”将日志写入本地磁盘,而json-file驱动程序是唯一与“docker

logs”命令并行工作的驱动程序。只要有人使用替代日志驱动程序,例如Syslog,Gelf或Splunk,则Docker日志API调用就会失败,而“docker

logs”命令将显示报告限制的错误,而不是在控制台上显示日志。docker log命令不仅会失败,而且很多其他使用Docker

API的日志工具,比如像Portainer这样的Docker用户界面,或者像Logspout这样的日志集合容器,都不能在这种情况下显示容器日志。

2. Docker Syslog驱动程序可以阻止容器部署

使用Docker Syslog驱动程序与TCP或TLS是提供日志的可靠方式。但是,Syslog日志驱动程序需要在启动容器时建立与Syslog服务器的TCP连接。如果无法在容器启动时建立此连接,则容器启动失败,并显示错误消息如docker: Error response from daemon: Failed to initialize logging driver: dial tcp

这意味着暂时的网络问题或高网络延迟可以阻止容器的部署。此外,Syslog服务器的重新启动可能会将所有通过TCP / TS的容器日志记录到中央Syslog服务器,这绝对是要避免的情况。

3.当目标关闭时,Docker Syslog驱动程序会丢失日志

与上面的问题#2类似,导致日志丢失的原因是Docker日志驱动程序在日志无法传递到远程目标时缺少了缓冲磁盘日志的能力。

4. Docker日志驱动程序不支持像Error Stack Traces这样的多行日志

当我们考虑日志时,大多数人都会想到简单的单行日志,比如Nginx或Apache日志。但是,日志也可以跨越多个行。例如,异常跟踪通常跨越多行,因此为了帮助Logstash用户,我们分享了如何使用Logstash处理堆栈跟踪。在容器世界中情况也不见得好一点,甚至反而更加复杂,因为在容器中运行的所有app的日志都被输出到相同的输出——标准输出。难怪看到问题#22920以“Closed.

Don’t care.”结束使得这么多人失望了。幸运的是,像Sematext Docker

Agent这样的工具可以立即可用地解析多行日志,以及应用自定义的多行模式。

5. Docker服务日志命令与非JSON日志记录驱动程序挂起

虽然json-files驱动程序看起来很健壮,但其他日志驱动程序可能仍然会造成Docker Swarm模式的麻烦。

6.如果fluentd守护进程已经失效并且缓冲区已满,则Docker守护进程会崩溃

另一种日志驱动程序在远程目标不可访问时会导致问题的情境——在这种情况下,日志驱动程序会抛出导致Docker后台程序崩溃的异常。

7.在Splunk驱动程序失败时,Docker Container陷入创建状态

如果Splunk服务器在容器启动时返回504,则容器实际上是启动的,但是Docker报告容器未能启动。一旦处于这种状态,容器将不再出现在docker ps下,并且容器进程不能通过docker kill停止。停止该过程的唯一方法是手动kill。

8. Docker日志跳过/缺少应用程序日志(journald驱动程序)

事实证明,这个问题是由journald速率限制引起的,当Docker为所有正在运行的应用程序创建日志时,需要增加日志速率限制,而由于其速率限制设置,journald可能会跳过某些日志。所以当你连接Docker的时候要注意你的journald设置。

9.Gelf驱动程序问题

Gelf日志驱动程序缺少TCP或TLS选项,并且仅支持UDP,当UDP数据包丢失时可能会有丢失日志消息的风险。有些问题报告了使用GELF驱动程序进行DNS解析/缓存的问题,所以当你的Graylog服务器IP更改时,你的日志可能会发送到“Nirvana”

——这使用容器部署可能会快速发生。

10. Docker不支持多个日志驱动程序

将日志存储在本地服务器上并将其发送到远程服务器是很好的。目前,Docker不支持多个日志驱动程序,所以用户不得不选择单个日志驱动程序。

尽管已经知道了这篇文章中列出的各种问题,但抉择起来依然不是一件易事。

相关文章:

  • long转string mybatis_mybatis split sring(mybatis 返回string)
  • X3DAudio
  • shell 删除了hdfs 文件_Hadoop 系列(六)—— HDFS 常用 Shell 命令
  • IE 里面的activeX控件的打印预览问题
  • mysql特定权限_Mysql中设置指定IP的特定用户及特定权限
  • 紧急寻人:北京工商大学的李阳同学
  • centos7 mysql 源码安装_CentOS7下MySQL5.7.13源码编译安装与配置
  • SD 2.0会议期间两个有趣的活动
  • 怎么查看视图结构mysql_MySQL 中如何查看组成视图的内容
  • wxWidgets滚动窗口绘图总结
  • mysql count when_在mysql中使用COUNT 或者SUM函数计算记录总数
  • Oracle创建主键时处理重复数据的程序
  • mysql engine用哪个_mysql各个engine之间的区别
  • 为什么要转mysql_资深程序员剖白:我为何要从MySql转向图形数据库
  • 近代自然科学为啥未诞生在中国----中国文化的欠缺
  • 分享的文章《人生如棋》
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Centos6.8 使用rpm安装mysql5.7
  • es6(二):字符串的扩展
  • github指令
  • Hibernate最全面试题
  • js操作时间(持续更新)
  • js数组之filter
  • Python打包系统简单入门
  • Vultr 教程目录
  • 分布式熔断降级平台aegis
  • 高度不固定时垂直居中
  • 简析gRPC client 连接管理
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Prometheus VS InfluxDB
  • 阿里云API、SDK和CLI应用实践方案
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #ifdef 的技巧用法
  • #include<初见C语言之指针(5)>
  • (52)只出现一次的数字III
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (五)MySQL的备份及恢复
  • (转)大型网站的系统架构
  • ******之网络***——物理***
  • .NET Core WebAPI中封装Swagger配置
  • ::什么意思
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ C++ ] STL_list 使用及其模拟实现
  • [20171101]rman to destination.txt
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [Docker]十.Docker Swarm讲解