推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

腾讯云容器服务日志采集最佳实践

   2023-08-04 网络整理佚名1270
核心提示:的日志功能对日志进行采集、存储与查询,分析各种功能用法与场景,给出一些最佳实践建议。创建日志采集规则时选择消费端,就需要指定日志集与日志主题,日志集通常提前创建好,日志主题通常选择自动创建:有了日志的原始数据,我们还需要告诉日志服务如何去解析日志,以方便后续对其进行检索。在创建日志采集规则时,需要配置日志的解析格式,下面针对各项配置给出分析与建议。

来源:

概述

本文介绍了如何使用腾讯云容器服务TKE的日志功能来收集、存储和查询日志,分析了各个功能的使用和场景,并给出了一些最佳实践建议。

注意:本文仅适用于 TKE 集群。

如何快速上手?

TKE 日志功能的入口在集群运维-日志规则中。 更多关于TKE集群如何开启日志采集及基本使用方法,请参考官方文档日志采集。

技术架构是怎样的?

TKE集群中开启日志采集后,会在各个节点上部署tke-log-agent,负责根据采集规则采集该节点上的容器日志,然后上报给CLS日志服务统一存储,通过CLS检索和分析:

日志收集在哪里?

TKE 使用日志采集时,需要在集群运维中新建一条日志采集规则——日志规则。 首先,需要确定收集的目标数据源是什么。 下面介绍三类支持的数据源以及各自的使用场景和建议。

收集标准输出

最简单也是最推荐的方式是将Pod中容器的日志输出到标准输出,日志内容将由容器运行时管理(,),这样有以下优点:

kubectl logs

样本采集配置:

收集容器中的文件

很多情况下,企业通过写入日志文件来记录日志。 使用容器运行业务时,日志文件会写入到容器中:

/var/lib/docker
/var/lib/kubelet

很多开源日志采集器都需要挂载 Pod 日志文件路径来采集,但是使用 TKE 的日志采集则不需要,所以如果日志输出到容器中的文件中,则无需关心是否是否已安装。

样本采集配置:

收集主机上的文件

如果业务将日志写入日志文件,但希望在容器停止后保留原来的日志文件,最好有一个备份,避免采集异常时日志完全丢失。 这时可以挂载日志文件路径,日志文件就会丢失。 磁盘到主机指定目录,容器停止后日志文件不会被清理。

由于日志文件不会被自动清理,有同学可能会担心日志会被重复收集。 例如,如果 Pod 计划离开然后计划返回,则日志文件将写入与之前相同的路径中。 是否会重复采集,这里分两种情况:

/data/log/nginx/access.log

因此,一般不会重复收藏。 如果日志框架自动轮转日志,建议采集规则不要使用通配符“*”来匹配日志文件。

样本采集配置:

日志吐到哪里了?

知道数据收集在哪里之后,我们还需要知道收集的日志存储在哪里。 根据上述技术架构可知,TKE 日志采集与云端的 CLS 日志服务集成,日志数据也会统一上报到日志服务。 日志服务通过日志集和日志主题来管理日志。 日志集是CLS的项目管理单元,可以包含多个日志主题; 一般情况下,同一业务的日志放在同一个日志集合中,同一个业务中的同一个类。在 TKE 中,日志采集规则和日志主题是一一对应的; TKE 创建日志采集规则并选择消费端时,需要指定日志集和日志主题,日志集通常是提前创建的,日志主题通常选择自动创建:

创建完成后,您可以根据情况对自动创建的日志主题进行重命名,以便后续检索时能够找到该日志所在的日志主题:

如何配置日志格式解析?

有了日志的原始数据,我们还需要告诉日志服务如何解析日志,以方便后续检索。 创建日志采集规则时,需要配置日志的解析格式。 下面针对每种配置给出分析和建议。

使用哪种抓取模式?

首先,我们需要确定日志的捕获模式,支持5种类型:单行文本、JSON、分隔符、多行文本和完整正则。

推荐使用JSON,因为JSON格式本身就构成了日志。 日志服务可以提取JSON key作为字段名,value作为对应的字段值。 不再需要根据业务日志输出格式配置复杂的匹配规则。 日志示例:

{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}

使用JSON捕获模式的前提是业务日志本身以JSON格式输出。 如果不是JSON格式,但切换成JSON格式的输出成本不高,建议切换。 如果确实很难切换,那么可以考虑其他捕获。 获取模式。

如果日志内容是固定格式的单行文本输出,请考虑使用“分隔”或“完整正则表达式”捕获模式。 “分隔符”是一种简单的格式,日志中的每个字段值都用固定的字符串分隔,例如用“:::”分隔,某条日志的内容为:

10.20.20.10 ::: [Tue Jan 22 14:49:45 CST 2019 +0800] ::: GET /online/sample HTTP/1.1 ::: 127.0.0.1 ::: 200 ::: 647 ::: 35 ::: http://127.0.0.1/

您可以配置“::​​:”自定义分隔符,并按顺序配置每个字段的字段名称,例如:

“Full Regex”适用于格式复杂的情况,使用正则表达式来匹配日志的格式。 如果日志内容为:

10.135.46.111 - - [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"  0.354 0.354

正则表达式可以设置为:

(\S+)[^\[]+(\[[^:]+:\d+:\d+:\d+\s\S+)\s"(\w+)\s(\S+)\s([^"]+)"\s(\S+)\s(\d+)\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)"\s+(\S+)\s(\S+).*

日志服务会使用()捕获组来区分各个字段,我们还需要为每个字段设置字段名称,配置示例:

如果日志没有固定的输出格式,可以考虑使用“单行文本”或“多行文本”捕获模式。 使用这两种模式,日志内容本身不会被结构化,也不会提取日志字段。 每条日志的时间戳也是由日志采集的时间决定的,检索时只能进行简单的模糊查询。 这两种模式的区别在于日志内容是单行还是多行。 如果是单行的话是最简单的,不需要设置任何匹配条件。 每一行都是一个单独的日志; 如果是多行,则需要设置第一行的正则表达式。 即匹配每条日志第一行的正则表达式。 当一行日志与预设的首行正则表达式匹配时,则视为日志的开头,下一行的开头出现作为日志的结束标识。 如果多行日志内容为:

10.20.20.10 - - [Tue Jan 22 14:24:03 CST 2019 +0800] GET /online/sample HTTP/1.1 127.0.0.1 200 628 35 http://127.0.0.1/group/1 
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0 0.310 0.310

那么第一行的正则表达式可以设置为:\d+\.\d+\.\d+\.\d+\s-\s.*

如何过滤掉不需要的内容?

可以过滤掉一些不重要或不相关的日志,以降低成本。

如果使用“JSON”、“分隔符”或“完全正则”捕获模式,日志内容将会结构化,并且可以指定一个字段对要保留的日志进行正则匹配:

对于“单行文本”和“多行文本”捕获模式,由于日志内容尚未结构化,因此无法指定要过滤的字段。 通常,直接使用正则表达式对要保留的完整日志内容进行模糊匹配:

需要注意的是,匹配内容一定要记得使用正则表达式,而不是完全匹配。 例如,如果您只想保留域名的日志,则匹配表达式应写为a\.test\.com。

如何自定义日志时间戳?

每条日志都需要有时间戳,主要用于检索,检索时可以选择时间范围。 默认情况下,日志的时间戳是由采集时间决定的,也可以自定义选择某个字段作为时间戳,在某些情况下可能会更准确,比如在创建采集规则之前,服务已经运行一段时间了,如果不设置自定义时间格式,采集时会将之前旧日志的时间戳设置为当前时间,导致时间不准确。

如何定制呢? 由于“单行文本”和“多行文本”捕获模式不对日志内容进行结构化处理,因此没有可以指定为时间戳的字段,并且无法自定义时间格式解析。 可以支持其他捕获模式。 为此,请关闭“使用收集时间”,然后选择要用作时间戳的字段名称,并配置时间格式。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON