本文介绍如何通过控制台创建iLogtail采集配置,并以DaemonSet采集方式采集容器标准输出。
前提条件
- 已安装Logtail组件。具体操作,请参见安装Logtail组件(阿里云Kubernetes集群)。
- 在您安装Logtail组件时所使用的Project中已完成Logstore创建。具体操作,请参见创建Logstore。
- 目标容器持续产生日志。重要 Logtail只采集增量日志。如果下发Logtail配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见读取日志。
功能特点
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通过容器元信息获取容器标准输出log-file的位置进行数据采集。
Logtail在采集容器的标准输出时,会定期将采集的点位信息保存到checkpoint文件中。如果Logtail停止后再次启动,会从上一次保存的点位开始采集。
使用限制
此功能目前仅支持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配置下的所有容器的标准输出处于同一上下文中,即无法使用控制台的上下文查询及Livetail功能直接查看某一容器标准输出的上下文。如果需要使用这些功能,请添加日志上下文聚合插件。更多信息,请参见aggregators配置。
数据处理:采集到的数据默认保存在
content
字段中。Logtail对于采集到的容器标准输出,支持数据处理。更多信息,请参见使用Logtail插件处理数据。
创建Logtail采集配置(旧版)
表单配置方式
登录日志服务控制台,在Project列表,单击打开目标Project。
在
页签中,单击目标Logstore。展开Logstore菜单栏,单击Logtail配置,然后单击添加Logtail配置。
在快速数据接入页面,单击K8S-标准输出-旧版。
在机器组配置步骤中,选择Logtail组件自动创建的机器组,一般命名为
k8s-group-*
。然后单击下一步。在Logtail配置步骤中,完成如下配置。
重要参数说明如下:
后续步骤根据向导完成即可。
CRD-AliyunPipelineConfig(推荐)
如果使用AliyunPipelineConfig,需要日志组件版本最低为0.5.1。
您只需要创建AliyunPipelineConfig CR即可创建iLogtail采集配置。创建完成后,系统自动应用该iLogtail采集配置。
执行如下命令创建一个YAML文件。
cube.yaml
为文件名,请根据实际情况替换。vim cube.yaml
在YAML文件中输入如下脚本,并根据实际情况设置其中的参数。
重要每个iLogtail采集配置必须单独设置一个对应的CR,如果多个CR关联同一个Logtail配置,后配置的CR将不会生效。
AliyunPipelineConfig
的参数,请参见【推荐】使用AliyunPipelineConfig管理采集配置。本文的iLogtail采集配置样例包含基础的标准输出采集功能,参数说明参见CreateLogtailPipelineConfig - 创建Logtail流水线配置。请确保
config.flushers.Logstore
参数配置的Logstore
已存在,可以通过配置spec.logstore
参数自动创建Logstore。
多行模式采集指定容器的标准输出
创建名为
k8s-stdout-
的iLogtail采集配置,对于集群内名称包含app
的所有容器,以多行模式采集标准输出,直接发送到名称为k8s-stdout
的Logstore,该Logstore属于名称为k8s-log-clusterid
的Project。apiVersion: telemetry.alibabacloud.com/v1alpha1 # 创建一个 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名 name: example-k8s-stdout spec: # 指定目标project project: name: k8s-log-clusterid # 创建用于存储日志的 Logstore logstores: - name: k8s-stdout # 定义iLogtail采集配置 config: # 日志样例(可不填写) sample: | 2024-06-19 16:35:00 INFO test log line-1 line-2 end # 定义输入插件 inputs: # 使用service_docker_stdout插件采集容器内文本日志 - Type: service_docker_stdout Stdout: true Stderr: true # 配置容器信息过滤条件,多个选项之间为“且”的关系。 # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。 K8sNamespaceRegex: "^(default)$" # 指定待采集容器的名称,支持正则匹配。 K8sContainerRegex: "^(.*app.*)$" # 配置多行切分配置 # 配置行首正则表达式 BeginLineRegex: \d+-\d+-\d+.* # 定义输出插件 flushers: # 使用flusher_sls插件输出到指定Logstore。 - Type: flusher_sls Logstore: k8s-stdout Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
执行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的标准输出,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
CRD-AliyunLogConfig
您只需要创建AliyunLogConfig CR即可创建iLogtail采集配置。创建完成后,系统自动应用该iLogtail采集配置。
执行如下命令创建一个YAML文件。
cube.yaml
为文件名,请根据实际情况替换。vim cube.yaml
在YAML文件中输入如下脚本,并根据实际情况设置其中的参数。
重要请确保
configName
字段值在安装Logtail组件的Project中唯一。如果多个CR关联同一个iLogtail采集配置,则删除或修改任意一个CR均会影响到该iLogtail采集配置,导致其他关联该iLogtail采集配置的CR状态与日志服务中iLogtail采集配置的状态不一致。
CR字段的格式请参见使用AliyunLogConfig管理采集配置。本文的iLogtail采集配置样例包含基础的标准输出采集功能,具体参数参见CreateConfig - 创建Logtail采集配置。
单行模式采集指定容器的标准输出
创建名为
example-stdout-example
的Logtail采集配置,以单行文本模式采集集群内所有名称开头为app的Pod的容器内的标准输出,直接发送到名称为k8s-stdout
的Logstore,该Logstore属于名称为k8s-log-clusterid
的Project。# 标准输出配置 apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。 name: simple-stdout-example spec: # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。 logstore: k8s-stdout # 设置Logtail采集配置。 logtailConfig: # 设置采集的数据源类型。采集标准输出时,需设置为plugin。 inputType: plugin # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。 configName: simple-stdout-example inputDetail: plugin: inputs: - # input type type: service_docker_stdout detail: # 指定采集stdout和stderr。 Stdout: true Stderr: true K8sPodRegex: "^(app.*)$"
执行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的标准输出,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
预览容器元信息
创建Logtail配置后,您可以在Logtail配置页面查看容器元信息以及容器未匹配过滤条件的原因。
仅Linux Logtail 1.4.0及以上版本或Windows Logtail 1.4.0.0及以上版本支持该功能。
在Project列表中,单击您在创建Logtail配置所使用的Project。
在
页签中,选择您在创建Logtail配置所使用的Logstore,然后单击Logstore左侧的>,选择 。在Logtail配置列表中,单击目标Logtail配置。
在Logtail配置页面中,单击编辑。
打开启用容器元信息预览开关。
单击容器元信息预览。
在容器预览对话框中,查看容器的元信息。
匹配容器页签中展示匹配您所设置的过滤条件的容器的元信息。
全量容器页签中展示当前Kubernetes集群中所有容器的元信息以及容器未匹配过滤条件的原因。
日志字段
Kubernetes集群的每条日志默认上传的字段如下所示。
字段名称 | 说明 |
_time_ | 日志采集时间。 |
_source_ | 日志源类型,stdout或stderr。 |
_image_name_ | 镜像名 |
_container_name_ | 容器名 |
_pod_name_ | Pod名 |
_namespace_ | Pod所在的命名空间 |
_pod_uid_ | Pod的唯一标识 |
问题排查
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。
当标准错误日志与访问日志格式不同,无法正常解析时,建议针对content加索引去搜索error。日志服务不支持使用提取字段的插件来做解析。更多信息,请参见创建索引。