本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
Logtail输入配置支持采集文本日志,本文主要介绍其配置方法。
功能入口
配置说明
主机场景
配置项 | 说明 |
文件路径 | 根据日志在主机(例如ECS)上的位置,设置日志目录和文件名称。
目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。 日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:
|
最大目录监控深度 | 设置日志目录被监控的最大深度,即文件路径中通配符 |
文件编码 | 选择日志文件的编码格式。 |
首次采集大小 | 配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。
您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。 |
采集黑名单 | 打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。 重要
支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下: 文件路径黑名单
文件黑名单选择文件黑名单,配置文件名为 目录黑名单
|
允许文件多次采集 | 默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需要打开允许文件多次采集开关。 |
高级参数 | 其它可选的与文件输入插件相关的高级功能参数,请参见创建Logtail流水线配置。 |
容器场景
表单配置(控制台配置)
参数名称 | 说明 |
Logtail部署模式 | Logtail部署模式。该配置项仅适用于采集K8s容器文本日志。
|
文件路径类型 | 选择待采集的文件路径是容器内路径或宿主机路径。对于通过hostPath方式挂载数据卷的容器,如果您希望直接采集其在宿主机上映射的日志文件,请选择宿主机路径,其余情况请选择容器内路径。 |
文件路径 |
目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。 日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:
|
最大目录监控深度 | 设置日志目录被监控的最大深度,即文件路径中通配符 警告 请按最小需要原则配置目录监控深度,过大的目录深度导致Logtail占用更多的监控资源,造成日志采集延迟。 |
启用容器元信息预览 | 打开启用容器元信息预览后,您可以在创建Logtail配置后,查看容器元信息,包括匹配容器信息和全量容器信息。 |
容器过滤 |
|
日志标签富化 | 环境变量相关tag和Pod标签相关tag。 |
文件编码 | 日志文件的编码格式。 |
首次采集大小 | 配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。
您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。 |
采集黑名单 | 打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。 重要
支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下: 文件路径黑名单
文件黑名单选择文件黑名单,配置文件名为 目录黑名单
|
允许文件多次采集 | 默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需打开允许文件多次采集开关。 |
高级参数 | Logtail配置的部分参数需要手动输入,请参见创建Logtail流水线配置。 |
配置示例
CRD-AliyunPipelineConfig
如果使用AliyunPipelineConfig,需要alibaba-log-controller的镜像版本不低于0.5.1。
参数 | 类型 | 是否必填 | 默认值 | 说明 |
Type | string | 是 | / | 插件类型。固定为input_file。 |
FilePaths | [string] | 是 | / | 待采集的日志文件路径列表(目前仅限1个路径)。路径中支持使用*和**通配符,其中**通配符仅能出现一次且仅限用于文件名前。 |
MaxDirSearchDepth | int | 否 | 0 | 文件路径中**通配符匹配的最大目录深度。仅当日志路径中存在**通配符时有效,取值范围为0~1000。 |
ExcludeFilePaths | [string] | 否 | 空 | 文件路径黑名单。路径必须为绝对路径,支持使用*通配符。 |
ExcludeFiles | [string] | 否 | 空 | 文件名黑名单。支持使用*通配符。 |
ExcludeDirs | [string] | 否 | 空 | 目录黑名单。路径必须为绝对路径,支持使用*通配符 |
FileEncoding | string | 否 | utf8 | 文件编码格式。可选值包括utf8和gbk。 |
TailSizeKB | uint | 否 | 1024 | 配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。如果文件大小小于该值,则从头开始采集,取值范围为0~10485760KB。 |
Multiline | object | 否 | 空 | 多行聚合选项。详见表1。 |
EnableContainerDiscovery | bool | 否 | false | 是否启用容器发现功能。仅当Logtail以Daemonset模式运行,且采集文件路径为容器内路径时有效。 |
ContainerFilters | object | 否 | 空 | 容器过滤选项。多个选项之间为“且”的关系,仅当EnableContainerDiscovery取值为true时有效,详见表2。 |
ExternalK8sLabelTag | map | 否 | 空 | 对于部署于K8s环境的容器,需要在日志中额外添加的与Pod标签相关的tag。map中的key为Pod标签名,value为对应的tag名。 例如:在map中添加 |
ExternalEnvTag | map | 否 | 空 | 对于部署于K8s环境的容器,需要在日志中额外添加的与容器环境变量相关的tag。map中的key为环境变量名,value为对应的tag名。 例如:在map中添加 |
AppendingLogPositionMeta | bool | 否 | false | 是否在日志中添加该条日志所属文件的元信息,包括__tag__:__inode__字段和__file_offset__字段。 |
FlushTimeoutSecs | uint | 否 | 5 | 当文件超过指定时间未出现新的完整日志时,将当前读取缓存中的内容作为一条日志输出。 |
AllowingIncludedByMultiConfigs | bool | 否 | false | 是否允许当前配置采集其它配置已匹配的文件。 |
表1:多行聚合选项
参数
类型
是否必填
默认值
说明
Mode
string
否
custom
多行聚合模式。可选值包括custom和JSON。
StartPattern
string
当Multiline.Mode取值为custom时,至少1个必填
空
行首正则表达式。
ContinuePattern
string
空
行继续正则表达式。
EndPattern
string
空
行尾正则表达式。
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
否
空
指定待采集Docker容器的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则默认为空,表示采集所有容器。支持正则匹配。 map中的key为容器标签名,value为容器标签的值,说明如下:
如果map中的value为空,则容器标签中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的容器会被匹配;其他情况下,当容器标签中存在以key为标签名且以value为标签值的情况时,相应的容器会被匹配。
ExcludeContainerLabel
map
否
空
指定需要排除采集Docker容器的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则默认为空,表示采集所有容器。支持正则匹配。 map中的key为容器标签名,value为容器标签的值,说明如下:
如果map中的value为空,则容器标签中包含以key为键的容器都会被匹配;
如果map中的value不为空,则:
若value以
^
开头并且以$
结尾,则当容器标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的容器会被匹配;其他情况下,当容器标签中存在以key为标签名且以value为标签值的情况时,相应的容器会被匹配。
配置示例
apiVersion: telemetry.alibabacloud.com/v1alpha1 kind: ClusterAliyunPipelineConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的Logtail采集配置名,如果名称重复则不会生效。 name: example-k8s-file spec: # 指定目标Project project: name: k8s-log-test logstores: # 创建名为 k8s-file的Logstore - name: k8s-file # 定义Logtail采集配置 config: # 日志样例(可不填写) sample: | 2024-06-19 16:35:00 INFO test log line-1 line-2 end # 定义输入插件 inputs: # 使用input_file插件采集容器内多行文本日志 - Type: input_file # 容器内的文件路径 FilePaths: - /data/logs/app_1/**/test.LOG # 启用容器发现功能。 EnableContainerDiscovery: true # 添加容器信息过滤条件,多个选项之间为“且”的关系。 CollectingContainersMeta: true ContainerFilters: # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。 K8sNamespaceRegex: default # 指定待采集容器的名称,支持正则匹配。 IncludeK8sLabel: app: ^(.*app.*)$ # 开启多行日志采集,单行日志采集请删除该配置 Multiline: # 选择自定义行首正则表达式模式 Mode: custom # 配置行首正则表达式 StartPattern: '\d+-\d+-\d+\s\d+:\d+:\d+' # 定义处理插件 processors: # 使用正则解析插件解析日志 - Type: processor_parse_regex_native # 源字段名 SourceKey: content # 解析用的正则表达式,用捕获组"()"捕获待提取的字段 Regex: (\d+-\d+-\d+\s\S+)(.*) # 提取的字段列表 Keys: ["time", "detail"] # 定义输出插件 flushers: # 使用flusher_sls插件输出到指定Logstore。 - Type: flusher_sls # 需要确保该 Logstore 存在 Logstore: k8s-file # 需要确保 endpoint 正确 Endpoint: cn-beijing.log.aliyuncs.com Region: cn-beijing TelemetryType: logs
预览容器元信息
创建Logtail配置后,您可以在Logtail配置页面查看容器元信息以及容器未匹配过滤条件的原因。
在Project列表中,单击您在创建Logtail配置所使用的Project。
在
页签中,选择您在创建Logtail配置所使用的Logstore,然后单击Logstore左侧的>,选择 。在Logtail配置列表中,单击目标Logtail配置。
在Logtail配置页面中,单击编辑。
打开启用容器元信息预览开关。
单击容器元信息预览。
在容器预览对话框中,查看容器的元信息。
匹配容器页签中展示匹配您所设置的过滤条件的容器的元信息。
全量容器页签中展示当前Kubernetes集群中所有容器的元信息以及容器未匹配过滤条件的原因。
K8s日志字段
K8s每条容器文本日志默认包含的字段如下表所示。
字段名称 | 说明 |
__tag__:__hostname__ | 容器宿主机的名称。 |
__tag__:__path__ | 容器内日志文件的路径。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的镜像名称。 |
__tag__:_pod_name_ | Pod的名称。 |
__tag__:_namespace_ | Pod所属的命名空间。 |
__tag__:_pod_uid_ | Pod的唯一标识符(UID)。 |
问题排查
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。
当标准错误日志与访问日志格式不同,无法正常解析时,建议针对content加索引去搜索error。日志服务不支持使用提取字段的插件来做解析。更多信息,请参见创建索引。
附录:容器场景文本日志采集原理说明
容器文本日志采集主要分为DaemonSet模式和Sidecar模式两种方式。
采集方式 | 场景 | 优势 | 劣势 |
DaemonSet | 一般情况下建议使用DaemonSet | 运维简单、资源占用少、支持采集容器的标准输出和文本文件、配置方式灵活。 | Logtail采集该节点内所有容器的日志,存在一定的性能瓶颈,且各个容器之间的隔离性较弱。 |
Sidecar | 需要每个Pod使用单独Logtail实例采集的情况以及ASK集群只能支持sidecar | 为每个需要采集日志的容器创建一个Sidecar容器,多租户隔离性好。 | 资源消耗较高,配置与维护较复杂, |
DaemonSet模式
Sidecar模式
容器发现
Logtail容器采集其他容器的日志,必须发现和确定哪些容器正在运行,这个过程称为容器发现。在容器发现阶段,Logtail容器不与Kubernetes集群的kube-apiserver进行通信,而是直接和节点上的容器运行时守护进程(Container Runtime Daemon)进行通信,从而获取当前节点上的所有容器信息,避免容器发现对集群kube-apiserver产生压力。
Logtail支持通过Namespace名称、Pod名称、Pod标签、容器环境变量等条件指定或排除采集相应容器的日志。
容器文件路径映射
在Kubernetes集群中,因为Pod之间资源隔离,Logtail容器无法直接访问其他Pod中的容器的文件。但是,容器内的文件系统都是由宿主机的文件系统挂载形成,通过将宿主机根目录所在的文件系统挂载到Logtail容器,就可以访问宿主机上的任意文件,从而间接采集业务容器文件系统的文件。容器内文件路径与宿主机文件路径之间的关系被称为文件路径映射。
日志文件在当前容器内的路径是/log/app.log
,假设映射后的宿主机路径是/var/lib/docker/containers/<container-id>/log/app.log
。Logtail默认将宿主机根目录所在的文件系统挂载到自身的/logtail_host
目录下,因此Logtail实际采集的文件路径为/logtail_host/var/lib/docker/containers/<container-id>/log/app.log
。
使用限制
容器运行时:Logtail只支持Docker和Containerd两种容器引擎。对于Docker只支持overlay、overlay2这两种存储驱动,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。
存储卷挂载方式:如果NAS以PVC的方式挂载到数据目录,不支持使用DaemonSet方式部署Logtail,建议使用Sidecar方式或Deployment方式部署Logtail并完成日志采集。具体操作,请参见采集K8s集群文本日志(Sidecar方式部署Logtail)和通过业务容器和Logtail容器共享PVC实现日志采集。
日志文件路径:
容器内文件路径暂不支持存在软链接,请按实际路径配置采集目录。
如果业务容器的数据目录通过数据卷(Volume)挂载,则填写的文件路径不能短于挂载点路径。例如
/var/log/service
目录是数据卷挂载的路径,则设置采集目录为/var/log
将无法采集该目录下的日志,因为采集目录比挂载路径短。必须设置采集目录为/var/log/service
或更深的目录。
日志文件采集停止:
docker:当容器被停止时,Logtail会立刻释放容器文件句柄,容器可正常退出。如果在容器停止前,出现因网络延迟、资源占用多等原因导致的采集延时,可能会丢失容器停止前的部分日志。
containerd:当容器被停止时,Logtail会持续持有容器内文件的句柄(即保持对日志文件的打开状态),直至所有日志文件内容发送完毕。因此,当出现网络延迟、资源占用多等原因导致的采集延时时,可能会导致业务容器不能及时销毁。