本文介绍如何通过控制台创建采集配置,并以DaemonSet采集方式采集Kubernetes标准输出。
前提条件
功能特点
Logtail支持采集容器内产生的标准输出,并附加容器的相关元数据信息一起上传到日志服务。标准输出文件采集具备以下功能特点。
- 支持采集标准输出文件(stdout)、标准出错文件(stderr)。
- 支持通过Label指定采集的容器。
- 支持通过Label指定排除的容器。
- 支持通过环境变量指定采集的容器。
- 支持通过环境变量指定排除的容器。
- 支持多行日志(例如java stack日志等)。
- 支持Docker容器日志自动打标签。
- 支持Kubernetes容器日志自动打标签。
说明
- 本文的Label为Docker inspect中的Label,并不是Kubernetes配置中的Label。
- 本文中的环境变量为容器启动中配置的环境变量信息。
实现原理
Logtail与Docker的Domain Socket进行通信,查询该Docker上运行的所有容器,并根据容器配置的Label和环境变量信息定位需要被采集的容器。Logtail会通过docker logs命令获取指定容器的日志。
Logtail在采集容器的标准输出时,会定期将采集的点位信息保存到checkpoint文件中,若Logtail停止后再次启动,会从上一次保存的点位开始采集日志。
使用限制
- 此功能目前仅支持Linux,依赖Logtail 0.16.0及以上版本,版本查看与升级参见安装Logtail(Linux系统)。
- Logtail默认通过
/var/run/docker.sock
访问Docker,请确保该Domain Socket存在且具备访问权限。 - 多行日志限制:为保证多行组成的一条日志不因为输出延迟而被分割成多条,多行日志情况下,采集的最后一条日志默认都会缓存一段时间。默认缓存时间为3秒,可通过
BeginLineTimeoutMs
设置,但此值不能低于1000(毫秒),否则容易出现误判。 - 采集停止策略:当容器被停止后,Logtail监听到容器
die
的事件后会停止采集该容器的标准输出,若此时采集出现延迟,则可能丢失停止前的部分输出。 - Docker日志驱动类型限制:目前标准输出采集仅支持JSON类型的日志驱动。
- 上下文限制:默认一个采集配置在同一上下文中,若需要每个容器的日志在不同上下文中,请单独为每个容器创建采集配置。
- 数据处理:采集到的数据默认字段为
content
,支持通用的处理配置。请参见处理数据配置一种或多种处理方式。
创建采集配置
默认字段
Kubernetes集群的每条日志默认上传的字段如下所示。
字段名 | 说明 |
---|---|
_time_ |
数据上传时间,例如2018-02-02T02:18:41.979147844Z |
_source_ |
输入源类型,stdout或stderr |
_image_name_ |
镜像名 |
_container_name_ |
容器名 |
_pod_name_ |
pod名 |
_namespace_ |
pod所在命名空间 |
_pod_uid_ |
pod的唯一标识 |
_container_id_ |
pod的IP地址 |
普通日志采集配置示例
- 环境变量配置方式
采集环境变量为
NGINX_PORT_80_TCP_PORT=80
且不为POD_NAMESPACE=kube-system
的stdout以及stderr日志。采集配置示例如下所示。{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeEnv": { "NGINX_PORT_80_TCP_PORT": "80" }, "ExcludeEnv": { "POD_NAMESPACE": "kube-system" } } } ] }
- Label配置方式
采集Label为
io.kubernetes.container.name=nginx
且不为type=pre
的stdout以及stderr日志。采集配置示例如下所示。{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeLabel": { "io.kubernetes.container.name": "nginx" }, "ExcludeLabel": { "type": "pre" } } } ] }
多行日志采集配置示例
多行日志采集对于Java异常堆栈输出的采集尤为重要,这里介绍一种标准Java的标准输出日志的采集配置。
- 日志示例
2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start 2018-02-03 14:18:41.969 ERROR [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : java.lang.NullPointerException at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ... 2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
- 采集配置
采集label为
app=monitor
的输入日志,日志以固定格式的日期开头(为提高匹配效率,这里只判断行首的10个字节)。{ "inputs": [ { "detail": { "BeginLineCheckLength": 10, "BeginLineRegex": "\\d+-\\d+-\\d+.*", "IncludeLabel": { "app": "monitor" } }, "type": "service_docker_stdout" } ] }
采集数据处理示例
Logtail对于采集到的Docker标准输出,支持数据处理,详情请参见处理数据。
- 采集Label为
app=monitor
输入的日志,日志以固定格式的日期开头(为提高匹配效率,这里只判断行首的10个字节)。使用正则表达式将日志解析成time、level、module、thread、message,采集配置和处理配置如下所示:{ "inputs": [ { "detail": { "BeginLineCheckLength": 10, "BeginLineRegex": "\\d+-\\d+-\\d+.*", "IncludeLabel": { "app": "monitor" } }, "type": "service_docker_stdout" } ], "processors": [ { "type": "processor_regex", "detail": { "SourceKey": "content", "Regex": "(\\d+-\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+)\\s+(\\w+)\\s+\\[([^]]+)]\\s+\\[([^]]+)]\\s+:\\s+([\\s\\S]*)", "Keys": [ "time", "level", "module", "thread", "message" ], "NoKeyError": true, "NoMatchError": true, "KeepSource": false } } ] }
例如日志2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
,经过处理后输出内容如下所示:__tag__:__hostname__:logtail-dfgef _container_name_:monitor _image_name_:registry.cn-hangzhou.aliyuncs.xxxxxxxxxxxxxxx _namespace_:default _pod_name_:monitor-6f54bd5d74-rtzc7 _pod_uid_:7f012b72-04c7-11e8-84aa-00163f00c369 _source_:stdout _time_:2018-02-02T14:18:41.979147844Z time:2018-02-02 02:18:41.968 level:INFO module:spring-cloud-monitor thread:nio-8080-exec-4 class:c.g.s.web.controller.DemoController message:service start done
- 采集label为
app=monitor
输入的日志,日志为JSON格式,采集配置和处理配置如下所示:{ "inputs": [ { "detail": { "IncludeLabel": { "app": "monitor" } }, "type": "service_docker_stdout" } ], "processors": [ { "type": "processor_json", "detail": { "SourceKey": "content", "NoKeyError":true, "KeepSource": false } } ] }