本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
Logtail输入配置支持采集容器标准输出。本文主要介绍新版标准输出采集配置。
功能特点
Logtail支持采集容器内产生的标准输出,并附加容器的相关元数据信息一起上传到日志服务。Logtail具备以下功能特点。
支持采集标准输出信息(stdout)和标准出错信息(stderr)。
支持通过容器Label白名单指定待采集的容器。
支持通过容器Label黑名单排除不需要采集的容器。
支持通过环境变量白名单指定待采集的容器。
支持通过环境变量黑名单排除不需要采集的容器。
支持采集多行日志(例如Java Stack日志)。
支持上报容器日志时自动关联Meta信息(例如容器名、镜像、Pod、Namespace、环境变量等)。
当容器运行于Kubernetes时,Logtail还具有以下功能。
支持通过Kubernetes Namespace名称、Pod名称、容器名称指定待采集的容器。
支持通过Kubernetes Label白名单指定待采集的容器。
支持通过Kubernetes Label黑名单排除不需要采集的容器。
支持上报容器日志时自动关联Kubernetes Label信息。
使用限制
新版标准输出采集插件目前仅支持Linux操作系统,并且不支持通过主机方式采集标准输出日志,支持Logtail2.1.5及以上版本。版本查看与升级,请参见安装Logtail组件(阿里云Kubernetes集群)和安装Logtail组件(自建Kubernetes集群)。
Logtail支持Docker和Containerd两种容器引擎的数据采集,访问路径说明如下:
Docker:Logtail通过/run/docker.sock访问Docker,请确保该路径存在且具备访问权限。
Containerd:Logtail通过/run/containerd/containerd.sock访问Containerd,请确保该路径存在且具备访问权限。
每条日志读取的最大值:默认值:524288(512 KB),最大值:8388608(8 MB)。单位:Byte。 如果您的单条日志超过524288 Byte,可给Logtail容器添加环境变量 max_read_buffer_size 进行修改。
采集停止策略:当容器被停止后,Logtail监听到容器
die
的事件后会停止采集该容器的标准输出。如果此时采集出现延迟,则可能丢失停止前的部分输出。Docker容器引擎限制:目前标准输出采集仅支持JSON类型的日志驱动。
数据处理:采集到的数据默认保存在
content
字段中。Logtail对于采集到的容器标准输出,支持数据处理。更多信息,请参见使用Logtail插件处理数据。新版标准输出采集插件支持原生处理插件(性能高,支持多线程)和扩展插件的组合使用。CRD方式支持AliyunPipelineConfig。
API方式支持CreateLogtailPipelineConfig - 创建Logtail流水线配置、UpdateLogtailPipelineConfig - 更新Logtail流水线配置等流水线配置。
功能优势
相较于旧版标准输出采集,新版标准输出的优势如下:
类型 | 新版标准输出插件优势(C++版本) |
性能大幅提升 | 采用C++重构,性能较旧版标准输出插件提升100%以上。 |
支持原生插件处理数据,多线程并行处理,充分利用系统资源。 | |
原生插件与Go插件灵活组合。 | |
更强的可靠性 | 支持标准输出日志轮转队列,日志采集机制和文件采集机制统一,在标准输出日志快速轮转时的场景可靠性高。 |
更低的资源消耗 | CPU使用率降低20%。 |
内存占用减少20%。 | |
运维一致性 | 新版标准输出采集插件的参数和文件采集插件的参数进行了统一。 |
容器元信息字段命名和Tag日志存储位置,与文件采集场景进行了统一,消费端只需维护同套处理逻辑。 |
配置说明
表单配置(控制台配置)
参数 | 说明 |
标准输出 | 打开标准输出后,Logtail将采集容器标准输出。 |
标准错误 | 打开标准错误后,Logtail将采集容器标准错误。 |
允许标准输出多次采集 | 默认情况下,一个容器的标准输出日志只能匹配一个Logtail新版标准输出采集配置。如果标准输出需要被多个新版标准输出采集配置采集,需打开允许标准输出多次采集开关。 |
启用容器元信息预览 | 打开启用容器元信息预览后,您可以在创建Logtail配置后,查看容器元信息,包括匹配容器信息和全量容器信息。 |
容器过滤 |
|
日志标签富化 | 您可以将环境变量和Kubernetes Label添加到日志,作为日志标签。 |
首次采集大小 | 配置首次生效时,标准输出日志文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。
您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。 |
高级参数 | Logtail配置的部分参数需要手动输入,请参见创建Logtail流水线配置。 |
配置示例
CRD-AliyunPipelineConfig
如果使用AliyunPipelineConfig,需要alibaba-log-controller的镜像版本不低于0.5.1。
参数 | 类型 | 是否必填 | 默认值 | 说明 |
Type | string | 是 | / | 插件类型。固定为input_container_stdio。 |
IgnoringStdout | Boolean | 否 | false | 是否忽略标准输出stdout。 |
IgnoringStderr | Boolean | 否 | false | 是否忽略标准出错信息stderr。 |
TailSizeKB | uint | 否 | 1024 | 配置首次生效时,标准输出文件的起始采集位置距离文件结尾的大小。如果文件大小小于该值,则从头开始采集,取值范围为0~10485760KB。 |
Multiline | object | 否 | 空 | 多行聚合选项,详见表1:多行聚合选项。 |
ContainerFilters | object | 否 | 空 | 容器过滤选项。多个选项之间为“且”的关系,详见表2:容器过滤选项。 |
ExternalK8sLabelTag | map | 否 | 空 | 对于部署于K8s环境的容器,需要在日志中额外添加的与Pod标签相关的tag。map中的key为Pod标签名,value为对应的tag名。 例如:在map中添加 |
ExternalEnvTag | map | 否 | 空 | 对于部署于K8s环境的容器,需要在日志中额外添加的与容器环境变量相关的tag。map中的key为环境变量名,value为对应的tag名。 例如:在map中添加 |
FlushTimeoutSecs | uint | 否 | 5 | 当文件超过指定时间未出现新的完整日志时,将当前读取缓存中的内容作为一条日志输出。 |
AllowingIncludedByMultiConfigs | bool | 否 | false | 是否允许当前配置采集其它配置已匹配的容器标准输出日志。 |
表1:多行聚合选项
参数
类型
是否必填
默认值
说明
Mode
string
否
custom
多行聚合模式。仅支持custom。
StartPattern
string
当Multiline.Mode取值为custom时必填
空
行首正则表达式。
UnmatchedContentTreatment
string
否
single_line
对于无法匹配的日志段的处理方式,可选值如下:
discard:丢弃。
single_line:将不匹配日志段的每一行各自存放在一个单独的事件中。
表2:容器过滤选项
参数
类型
是否必填
默认值
说明
K8sNamespaceRegex
string
否
空
对于部署于K8s环境的容器,指定待采集容器所在Pod所属的命名空间条件。如果未添加该参数,则表示采集所有容器。支持正则匹配。
K8sPodRegex
string
否
空
对于部署于K8s环境的容器,指定待采集容器所在Pod的名称条件。如果未添加该参数,则表示采集所有容器。支持正则匹配。
IncludeK8sLabel
map
否
空
对于部署于K8s环境的容器,指定待采集容器所在Pod的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则表示采集所有容器。支持正则匹配。 map中的key为Pod标签名,value为Pod标签的值,说明如下:
如果map中的value为空,则Pod标签中包含以key为键的Pod都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当pod标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的pod会被匹配。其他情况下,当Pod标签中存在以key为标签名且以value为标签值的情况时,相应的Pod会被匹配。
ExcludeK8sLabel
map
否
空
对于部署于K8s环境的容器,指定需要排除采集容器所在Pod的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则表示采集所有容器。支持正则匹配。 map中的key为Pod标签名,value为Pod标签的值,说明如下:
如果map中的value为空,则Pod标签中包含以key为键的Pod都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当pod标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的pod会被匹配。其他情况下,当Pod标签中存在以key为标签名且以value为标签值的情况时,相应的Pod会被匹配。
K8sContainerRegex
string
否
空
对于部署于K8s环境的容器,指定待采集容器的名称条件。如果未添加该参数,则表示采集所有容器。支持正则匹配。
IncludeEnv
map
否
空
指定待采集容器的环境变量条件。多个条件之间为“或”的关系,如果未添加该参数,则表示采集所有容器。支持正则匹配。 map中的key为环境变量名,value为环境变量的值,说明如下:
如果map中的value为空,则容器环境变量中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器环境变量中存在以key为环境变量名且对应环境变量值能正则匹配value的情况时,相应的容器会被匹配。其他情况下,当容器环境变量中存在以key为环境变量名且以value为环境变量值的情况时,相应的容器会被匹配。
ExcludeEnv
map
否
空
指定需要排除采集容器的环境变量条件。多个条件之间为“或”的关系,如果未添加该参数,则表示采集所有容器。支持正则匹配。 map中的key为环境变量名,value为环境变量的值,说明如下:
如果map中的value为空,则容器环境变量中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器环境变量中存在以key为环境变量名且对应环境变量值能正则匹配value的情况时,相应的容器会被匹配。其他情况下,当容器环境变量中存在以key为环境变量名且以value为环境变量值的情况时,相应的容器会被匹配。
IncludeContainerLabel
map
否
空
指定待采集容器的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则默认为空,表示采集所有容器。支持正则匹配。 map中的key为容器标签名,value为容器标签的值,说明如下:
如果map中的value为空,则容器标签中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的容器会被匹配。其他情况下,当容器标签中存在以key为标签名且以value为标签值的情况时,相应的容器会被匹配。
ExcludeContainerLabel
map
否
空
指定需要排除采集容器的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则默认为空,表示采集所有容器。支持正则匹配。 map中的key为容器标签名,value为容器标签的值,说明如下:
如果map中的value为空,则容器标签中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的容器会被匹配。其他情况下,当容器标签中存在以key为标签名且以value为标签值的情况时,相应的容器会被匹配。
配置示例
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: # 使用input_container_stdio插件采集容器标准输出 - Type: input_container_stdio # 采集stdout日志 IgnoringStdout: false # 不采集stderr日志 IgnoringStderr: true # 配置容器信息过滤条件,多个选项之间为“且”的关系。 ContainerFilters: # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。 K8sNamespaceRegex: "^(default)$" # 指定待采集容器的名称,支持正则匹配。 K8sContainerRegex: "^(.*app.*)$" # 配置多行切分配置 # 配置行首正则表达式 Multiline: Mode: custom StartPattern: \d+-\d+-\d+.* UnmatchedContentTreatment: single_line # 定义输出插件 flushers: # 使用flusher_sls插件输出到指定Logstore。 - Type: flusher_sls Logstore: k8s-stdout Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
预览容器元信息
创建Logtail配置后,您可以在Logtail配置页面查看容器元信息以及容器未匹配过滤条件的原因。
在Project列表中,单击您在创建Logtail配置所使用的Project。
在
页签中,选择您在创建Logtail配置所使用的Logstore,然后单击Logstore左侧的>,选择 。在Logtail配置列表中,单击目标Logtail配置。
在Logtail配置页面中,单击编辑。
打开启用容器元信息预览开关。
单击容器元信息预览。
在容器预览对话框中,查看容器的元信息。
匹配容器页签中展示匹配您所设置的过滤条件的容器的元信息。
全量容器页签中展示当前Kubernetes集群中所有容器的元信息以及容器未匹配过滤条件的原因。
日志字段
Kubernetes集群的每条日志默认上传的字段如下所示。
字段名称 | 说明 |
_time_ | 日志采集时间。 |
_source_ | 日志源类型,stdout或stderr。 |
__tag__:_image_name_ | 镜像名 |
__tag__:_container_name_ | 容器名 |
__tag__:_pod_name_ | Pod名 |
__tag__:_namespace_ | Pod所在的命名空间 |
__tag__:_pod_uid_ | Pod的唯一标识 |
问题排查
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。
当标准错误日志与访问日志格式不同,无法正常解析时,建议针对content加索引去搜索error。日志服务不支持使用提取字段的插件来做解析。更多信息,请参见创建索引。