解决方案:面向容器日志的技术实践
优采云 发布时间: 2022-11-30 09:48解决方案:面向容器日志的技术实践
摘要:本文以Docker为例,结合阿里云日志服务团队在日志领域多年积累的丰富经验,介绍容器日志处理的通用方法和最佳实践。
背景
自2013年dotCloud开源Docker以来,以Docker为代表的容器产品以其隔离性好、可移植性高、资源占用低、启动快等特点迅速风靡全球。下图显示了自 2013 年以来 Docker 和 OpenStack 的搜索趋势。
容器技术在部署和交付方面给人们带来了很多便利,但也给日志处理领域带来了很多新的挑战,包括:
如果日志保存在容器内,当容器被销毁时,日志将被删除。由于容器的生命周期比虚拟机短很多,创建和销毁是很正常的,所以需要一种持久化保存日志的方法;
进入容器时代后,需要管理的目标对象远多于虚拟机或物理机,登录目标容器排查问题会变得更加复杂和不经济;
容器的出现让微服务更容易落地。它引入了更多组件,同时为我们的系统带来了松耦合。因此,我们需要一种技术,既能帮助我们全局了解系统的运行情况,又能快速定位问题点,还原上下文。
日志处理流程
本文以Docker为例,依托阿里云日志服务团队在日志领域多年积累的丰富经验,介绍容器日志处理的通用方法和最佳实践,包括:
实时采集
容器日志;
查询分析和可视化;
日志上下文分析;
LiveTail - 云上的 tail -f。
实时采集
容器日志
容器日志分类
要采集
日志,您必须首先找到日志所在的位置。这里我们以Nginx和Tomcat这两个常用的容器为例进行分析。
Nginx产生的日志包括access.log和error.log。根据 nginx Dockerfile,access.log 和 error.log 分别重定向到 STDOUT 和 STDERR。
Tomcat会产生很多日志,包括catalina.log、access.log、manager.log、host-manager.log等。Tomcat Dockerfile不会将这些日志重定向到标准输出,它们存在于容器内部。
容器产生的大部分日志都可以归结为以上几种情况。在这里,我们不妨将容器日志分为以下两类。
标准输出
使用日志记录驱动程序
容器的标准输出将由日志驱动统一处理。如下图所示,不同的日志记录驱动程序会将标准输出写入不同的目的地。
通过logging driver采集
容器的标准输出的好处是使用方便,例如:
缺点
使用除 json-file 和 journald 之外的其他日志记录驱动程序将使 docker logs API 无法使用。例如,当你在宿主机上使用portainer管理容器,使用除上述两种之外的日志驱动时,你会发现无法通过UI界面观察到容器的标准输出。
使用 docker 日志 API
对于那些使用默认日志驱动的容器,我们可以通过向 docker 守护进程发送 docker logs 命令来获取容器的标准输出。使用这种方式采集
日志的工具有logspout、sematext-agent-docker等。以下示例中的命令表示获取容器自2018-01-01T15:00:00以来的最新5条日志。
缺点
当日志量较大时,这种方式会给docker daemon带来很大的压力,导致docker daemon无法及时响应创建容器、销毁容器等命令。
采集
json-file 文件
默认的logging driver会将日志以json格式写入host文件,文件路径为/var/lib/docker/containers//-json.log。这样就可以通过直接采集宿主机文件来达到采集容器标准输出的目的。
推荐这个方案,因为既不会导致docker logs API不可用,也不会影响docker daemon,而且现在很多工具都原生支持采集
host文件,比如filebeat、logtail等。
文本日志
挂载主机目录
在容器中采集
文本日志,最简单的方式是在启动容器时,通过bind mount或volumes将宿主机目录挂载到容器日志所在的目录,如下图所示。
" />
tomcat容器的access log,使用命令docker run -it -v /tmp/app/vol1:/usr/local/tomcat/logs tomcat挂载host目录/tmp/app/vol1到access log in容器在/usr/local/tomcat/logs目录下,通过采集
host目录/tmp/app/vol1下的日志来达到采集
tomcat访问日志的目的。
计算容器rootfs挂载点
使用挂载宿主机目录的方式采集
日志会对应用程序造成侵入,因为它要求容器在启动时收录
挂载命令。如果捕获过程可以对用户透明,那就太好了。其实这可以通过计算容器的rootfs挂载点来实现。
容器rootfs挂载点离不开的一个概念就是存储驱动。在实际使用中,用户往往会根据Linux版本、文件系统类型、容器读写情况等因素选择合适的存储驱动。在不同的存储驱动下,容器的rootfs挂载点遵循一定的规则,所以我们可以根据存储驱动的类型推断出容器的rootfs挂载点,然后采集
容器的内部日志。下表是一些存储驱动的rootfs挂载点及其计算方法。
Logtail解决方案
日志服务团队在充分对比各种容器日志采集
方式,综合梳理用户的反馈和诉求后,推出了容器日志一站式解决方案。
特征
logtail解决方案包括以下功能:
支持采集
主机上容器的主机文件和日志(包括标准输出和日志文件);
支持容器自动发现,即在你配置好采集目标后,只要有符合条件的容器被创建,就会自动采集该容器上的目标日志;
支持通过docker标签和环境变量过滤指定容器,支持白名单和黑名单机制;
自动标记采集到的数据,即在采集到的日志中自动添加容器名称、容器IP、文件路径等标识数据来源的信息;
支持采集
K8s容器日志。
核心优势
通过检查点机制和额外监控进程的部署确保至少一次语义;
经过多次双十一、双十二的测试,以及阿里集团内部百万级别的部署规模,稳定性和性能都非常有保障。
k8s容器日志采集
与K8s生态深度融合,能够便捷采集K8s容器日志是日志服务logtail方案的另一大特色。
采集配置管理:
支持通过WEB控制台进行采集和配置管理;
支持通过CRD(CustomResourceDefinition)进行采集和配置管理(这种方式更容易与K8s的部署发布流程结合)。
采集方式:
支持通过DaemonSet方式采集
K8s容器日志,即在每个节点运行一个采集
客户端logtail,适用于单功能集群;
支持通过Sidecar方式采集
K8s容器日志,即每个Pod以容器的形式运行一个采集
客户端logtail,适用于大型、混合、PaaS集群。
关于Logtail方案的详细描述,请参考文章整体提升,阿里云Docker/Kubernetes(K8S)日志方案及选型对比。
查询分析和可视化
日志采集完成后,下一步就是对这些日志进行查询、分析和可视化。这里以Tomcat访问日志为例,介绍日志服务提供的强大的查询、分析、可视化功能。
快速搜索
采集
容器日志时会携带容器名称、容器IP、目标文件路径等信息,查询时可以利用这些信息快速定位目标容器和文件。关于查询功能的详细介绍,请参考文档查询语法。
实时分析
日志服务实时分析功能兼容SQL语法,提供200多种聚合函数。如果您有使用SQL的经验,您可以轻松编写出符合业务需求的分析语句。例如:
统计访问次数最多的前 10 个 URI。
统计当前15分钟内网络流量相对于前一小时的变化情况。
该语句使用 YoY 函数计算不同时间段的网络流量。
可视化
为了让数据更加生动,您可以使用日志服务内置的各种图表将SQL计算结果可视化,并将图表组合成仪表盘。
下图是一个基于Tomcat访问日志的dashboard,展示了错误请求率、网络流量、状态码随时间变化的趋势等信息。仪表板显示多个 Tomcat 容器的聚合数据。您可以使用dashboard filter功能,通过指定容器名称查看单个容器的数据。
" />
日志上下文分析
查询分析、仪表盘等功能可以帮助我们把握整体信息,了解系统的整体运行情况,但定位具体问题往往需要借助上下文信息。
上下文定义
上下文是指围绕问题的线索,例如日志中错误的上下文。上下文由两个元素组成:
下表显示了不同数据源的最小粒度。
上下文查询的挑战
在日志集中存储的场景下,采集器和服务器都很难保证日志的原创
顺序:
在客户端层面,一台主机上运行着多个容器,每个容器都有多个目标文件需要采集
。日志采集软件需要利用机器的多个CPU核对日志进行解析和预处理,通过多线程并发或单线程异步回调处理网络发送的慢IO问题。这可以防止日志数据按照在机器上生成事件的顺序到达服务器。
在服务器层面,由于横向扩展的多机负载均衡架构,同一台客户端机器的日志会分散在多个存储节点上。很难根据分布式日志恢复原来的顺序。
原则
日志服务通过在每条日志中附加一些附加信息和服务端的关键词查询能力,巧妙地解决了上述问题。原理如下图所示。
采集日志时,会自动添加用于标识日志来源的信息(即上面提到的最小区分粒度),作为source_id。对于容器场景,该信息包括容器名称、文件路径等;
日志服务的各种采集客户端一般会选择批量上传日志,几条日志组成一个数据包。客户端会在这些数据包中写入一个单调递增的package_id,包中的每条日志在包内都有一个偏移量;
服务器会将source_id、package_id和offset组合成一个字段,并为其建立索引。这样即使各种日志混杂存放在服务器端,我们也可以根据source_id、package_id、offset准确定位到一条日志。
了解更多上下文分析功能,请参考文章上下文查询,分布式系统日志上下文查询功能。
LiveTail - 云端尾巴 -f
除了查看日志的上下文信息,有时我们还希望能够持续观察容器的输出。
传统方式
传统模式下实时监控容器日志的方法如下表所示。
痛点
传统方式监控容器日志存在以下痛点:
当容器较多时,定位目标容器费时费力;
不同类型的容器日志需要不同的观察方式,增加了使用成本;
关键信息查询展示不够简洁直观。
功能与原理
为了解决这些问题,日志服务推出了LiveTail功能。与传统模式相比,具有以下优点:
可根据单条日志或日志服务的查询分析功能快速定位目标容器;
不进入目标容器,统一观察不同类型的容器日志;
支持关键词过滤;
支持设置键列。
在实现上,LiveTail主要是利用上一章提到的上下文查询原理,快速定位到目标容器和目标文件。然后客户端周期性的向服务端发送请求拉取最新的数据。
视频样本
您也可以观看视频进一步了解容器日志的采集、查询、分析和可视化。
参考
结尾
更令人兴奋的
解决方案:网站首页设计需要注意的问题
首页是我们网站中最重要的页面,所以有才华的设计师花最多的时间和精力来思考首页的设计。那么在设计主页时主要要注意哪些事项呢?
页面内容要新颖
突出一个“新”字,这个原则要求我们在设计网站内容时不能抄袭别人的内容,而是要结合自己的实际情况,打造一个独一无二的网站。所以,在设计网页的时候,一定要在选材上下功夫。选材尽量“少”“精”,要突出“新”
网站 关键词
" />
关键词是用户在寻找我们想要的信息时在搜索引擎上输入的字符,所以关键词对于网站优化来说是极其重要的,它几乎决定了网站的排名和流量,而关键词可以在首页设置,首页的关键词是优化网站最重要的方式。关键词的设计形式主要是关键词加长尾关键词,而关键词的布局形式首页采用一级关键词,内页采用二级关键词。
网站布局
网站的布局也是设计首页时需要注意的,因为首页的布局风格与用户的浏览习惯有关。一种排版模式。但现在用户普遍能够接受新颖的排版方式。不同的设计布局可能会给用户带来亮点,增加用户浏览网站的时间。
使用较少的特殊字体
" />
尽管您可以在 HTML 中使用特殊字体,但无法预测访问者将在他们的计算机上看到什么。在您的计算机上看起来不错的页面在不同的平台上可能看起来很糟糕。一些网页设计师喜欢使用定义属性,这允许您使用特殊字体,但仍然需要一些解决方法,以防您选择的字体不显示在访问者的计算机上。
联亚网络科技*敏*感*词*是一家以战略、创意、设计、技术和服务为核心的互联网公司。核心技术自主研发,拥有众多网页设计行业知名设计师,经过12年的发展,与数百家上市公司的成功合作经验,数万家企业放心选择的服务商,让我们成长为一家互联网精英公司——一家集策划思维、设计执行、服务意识为一体的深圳网站建设公司。
联亚产品一定要生产高品质的产品,这是我们的核心理念。
联亚愿与客户共同成长,携手前行。咨询*敏*感*词*:0755-82940957