本文介绍如何通过控制台创建Logtail采集配置,并以DaemonSet采集方式采集容器标准输出。
前提条件
- 已安装Logtail组件。具体操作,请参见安装Logtail组件。
- 在您安装Logtail组件时所使用的Project中已创建Logstore。具体操作,请参见创建Logstore。
功能特点
Logtail支持采集容器内产生的标准输出,并附加容器的相关元数据信息一起上传到日志服务。Logtail具备以下功能特点。
- 支持采集标准输出信息(stdout)和标准出错信息(stderr)。
- 支持通过容器Label白名单指定待采集的容器。
- 支持通过容器Label黑名单排除不要采集的容器。
- 支持通过环境变量白名单指定待采集的容器。
- 支持通过环境变量黑名单排除不要采集的容器。
- 支持采集多行日志(例如Java Stack日志)。
- 支持上报容器日志时自动关联Meta信息(例如容器名、镜像、Pod、Namespace、环境变量等)。
- 当容器运行于Kubernetes时,Logtail还具有以下功能。
- 支持通过Kubernetes Namespace名称、Pod名称、容器名称指定待采集的容器。
- 支持通过Kubernetes Label白名单指定待采集的容器。
- 支持通过Kubernetes Label黑名单排除不要采集的容器。
- 支持上报容器日志时自动关联Kubernetes Label信息。
实现原理
Logtail与Docker的Domain Socket进行通信,查询该Docker上运行的所有容器,并根据容器中的Label和环境变量定位需要被采集的容器。Logtail通过docker logs
命令获取指定容器日志。

使用限制
- 此功能目前仅支持Linux操作系统,依赖Logtail 0.16.0及以上版本。版本查看与升级,请参见安装Logtail(Linux系统)。
- Logtail支持Docker和Containerd两种容器引擎的数据采集,访问路径说明如下:
- Docker:Logtail通过/run/docker.sock访问Docker,请确保该路径存在且具备访问权限。
- Containerd:Logtail通过/run/containerd/containerd.sock访问Containerd,请确保该路径存在且具备访问权限。
- 多行日志限制:为保证多行组成的一条日志不因为输出延迟而被分割成多条,多行日志情况下,采集的最后一条日志默认都会缓存一段时间。默认缓存时间为3秒,可通过
BeginLineTimeoutMs
参数修改,但此值不能低于1000(毫秒),否则容易出现误判。 - 采集停止策略:当容器被停止后,Logtail监听到容器
die
的事件后会停止采集该容器的标准输出。如果此时采集出现延迟,则可能丢失停止前的部分输出。 - Docker容器引擎限制:目前标准输出采集仅支持JSON类型的日志驱动。
- 上下文限制:默认一个Logtail采集配置在同一上下文中。如果需要每个容器的日志在不同上下文中,请单独为每个容器创建Logtail采集配置。
- 数据处理:采集到的数据默认保存在
content
字段中。Logtail对于采集到的容器标准输出,支持数据处理。更多信息,请参见使用Logtail插件处理数据。
创建采集配置
普通日志的Logtail采集配置示例
示例1:通过环境变量黑白名单过滤容器
采集环境变量为NGINX_SERVICE_PORT=80
且不为POD_NAMESPACE=kube-system
的容器的标准输出。
- 获取环境变量。
您可以登录容器所在的宿主机查看容器的环境变量。具体操作,请参见获取容器环境变量。
- 创建Logtail采集配置。
Logtail采集配置示例如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeEnv": { "NGINX_SERVICE_PORT": "80" }, "ExcludeEnv": { "POD_NAMESPACE": "kube-system" } } } ] }
示例2:通过容器Label黑白名单过滤容器
采集容器Label为io.kubernetes.container.name=nginx
的容器的标准输出。
- 获取容器Label。
您可以登录容器所在的宿主机查看容器的Label。具体操作,请参见获取容器Label。
- 创建Logtail采集配置。
Logtail采集配置示例如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeLabel": { "io.kubernetes.container.name": "nginx" } } } ] }
示例3:通过Kubernetes Namespace名称、Pod名称和容器名称过滤容器
采集default命名空间下以nginx-log-demo开头的Pod中的nginx-log-demo-0容器的标准输出。
- 获取Kubernetes层级的信息。
- 获取Pod信息。
- 获取Namespace等信息。
- 获取Pod信息。
- 创建Logtail采集配置。
Logtail采集配置示例如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "K8sNamespaceRegex":"^(default)$", "K8sPodRegex":"^(nginx-log-demo.*)$", "K8sContainerRegex":"^(nginx-log-demo-0)$" } } ] }
示例4:通过Kubernetes Label过滤容器
采集Kubernetes Label中Key为job-name,Value以nginx-log-demo开头的所有容器的标准输出。
- 获取Kubernetes Label。
- 创建Logtail采集配置。
Logtail采集配置示例如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeK8sLabel":{ "job-name":"^(nginx-log-demo.*)$" } } } ] }
多行日志的Logtail采集配置示例
- 日志示例
2021-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start 2021-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) ... 2021-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
- Logtail采集配置
采集容器Label为
app=monitor
的容器的Java异常堆栈输出,该输出内容以固定格式的日期开头。为提高匹配效率,此处只判断行首的10个字节。采集到日志服务后,日志服务使用正则表达将其解析成time、level、module、thread、message等字段。- inputs为Logtail采集配置,必选项,请根据您的数据源配置。
说明 一个inputs中只允许配置一个类型的数据源。
- processors为Logtail处理配置,可选项。您可以配置一种或多种处理方式。具体操作,请参见使用Logtail插件处理数据。
{ "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]*)", "Keys": [ "time", "level", "module", "thread", "message" ], "NoKeyError": true, "NoMatchError": true, "KeepSource": false } } ] }
- inputs为Logtail采集配置,必选项,请根据您的数据源配置。
- 解析后的日志
例如
2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
日志,经过解析后的日志内容如下所示。其中:- _time_为日志采集时间。您可以通过Logtail采集配置中的时区属性参数设置_time_的时区。
- time为日志中存在的时间内容,是从日志中提取得到的。
__tag__:__hostname__:logtail-dfgef _container_name_:monitor _image_name_:example.com-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
日志字段
字段名称 | 说明 |
---|---|
_time_ | 日志采集时间,例如2021-02-02T02:18:41.979147844Z 。
|
_source_ | 日志源类型,stdout或stderr。 |
_image_name_ | 镜像名 |
_container_name_ | 容器名 |
_pod_name_ | Pod名 |
_namespace_ | Pod所在的命名空间 |
_pod_uid_ | Pod的唯一标识 |