文本输入插件

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

Logtail输入配置支持采集文本日志,本文主要介绍其配置方法。

功能入口

配置说明

主机场景

配置项

说明

文件路径

根据日志在主机(例如ECS)上的位置,设置日志目录和文件名称。

  • 如果目标主机是Linux系统,则日志路径必须以正斜线(/)开头,例如/apsara/nuwa/**/app.Log

  • 如果目标主机是Windows系统,则日志路径必须以盘符开头,例如C:\Program Files\Intel\**\*.Log

目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。

日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:

  • /apsara/nuwa/**/*.log表示/apsara/nuwa目录(包含该目录的递归子目录)中后缀名为.log的文件。

  • /var/logs/app_*/**/*.log表示/var/logs目录下所有符合app_*格式的目录(包含该目录的递归子目录)中后缀名为.log的文件。

  • /var/log/nginx/**/access*表示/var/log/nginx目录(包含该目录的递归子目录)中以access开头的文件。

最大目录监控深度

设置日志目录被监控的最大深度,即文件路径中通配符**匹配的最大目录深度。0代表只监控本层目录。

文件编码

选择日志文件的编码格式。

首次采集大小

配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。

  • 首次采集时,如果文件小于1024 KB,则从文件内容起始位置开始采集。

  • 首次采集时,如果文件大于1024 KB,则从距离文件末尾1024 KB的位置开始采集。

您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。

采集黑名单

打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。

重要
  • 如果您在配置文件路径时使用了通配符,但又需要过滤掉其中部分路径,则需在采集黑名单中填写对应的完整路径来保证黑名单配置生效。

    例如您配置文件路径/home/admin/app*/log/*.log,但要过滤/home/admin/app1*目录下的所有子目录,则需选择目录黑名单,配置目录为/home/admin/app1*/**。如果配置为/home/admin/app1*,黑名单不会生效。

  • 匹配黑名单过程存在计算开销,建议黑名单条目数控制在10条内。

  • 目录路径不能以正斜线(/)结尾,例如将设置路径为/home/admin/dir1/,目录黑名单不会生效。

支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下:

文件路径黑名单

  • 选择文件路径黑名单,配置路径为/home/admin/private*.log,则表示在采集时忽略/home/admin/目录下所有以private开头,以.log结尾的文件。

  • 选择文件路径黑名单,配置路径为/home/admin/private*/*_inner.log,则表示在采集时忽略/home/admin/目录下以private开头的目录内,以_inner.log结尾的文件。例如/home/admin/private/app_inner.log文件被忽略,/home/admin/private/app.log文件被采集。

文件黑名单

选择文件黑名单,配置文件名为app_inner.log,则表示采集时忽略所有名为app_inner.log的文件。

目录黑名单

  • 选择目录黑名单,配置目录为/home/admin/dir1,则表示在采集时忽略/home/admin/dir1目录下的所有文件。

  • 选择目录黑名单,配置目录为/home/admin/dir*,则表示在采集时忽略/home/admin/目录下所有以dir开头的子目录下的文件。

  • 选择目录黑名单,配置目录为/home/admin/*/dir,则表示在采集时忽略/home/admin/目录下二级目录名为dir的子目录下的所有文件。例如/home/admin/a/dir目录下的文件被忽略,/home/admin/a/b/dir目录下的文件被采集。

允许文件多次采集

默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需要打开允许文件多次采集开关。

高级参数

其它可选的与文件输入插件相关的高级功能参数,请参见创建Logtail流水线配置

容器场景

表单配置(控制台配置)

参数名称

说明

Logtail部署模式

Logtail部署模式。该配置项仅适用于采集K8s容器文本日志。

  • DaemonSet

  • Sidecar

文件路径类型

选择待采集的文件路径是容器内路径或宿主机路径。对于通过hostPath方式挂载数据卷的容器,如果您希望直接采集其在宿主机上映射的日志文件,请选择宿主机路径,其余情况请选择容器内路径。

文件路径

  • 如果目标容器节点是Linux系统,则日志路径必须以正斜线(/)开头,例如/apsara/nuwa/**/app.Log

  • 如果目标容器节点是Windows系统,则日志路径必须以盘符开头,例如C:\Program Files\Intel\**\*.Log

目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。

日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:

  • /apsara/nuwa/**/*.log表示/apsara/nuwa目录(包含该目录的递归子目录)中后缀名为.log的文件。

  • /var/logs/app_*/**/*.log表示/var/logs目录下所有符合app_*格式的目录(包含该目录的递归子目录)中后缀名为.log的文件。

  • /var/log/nginx/**/access*表示/var/log/nginx目录(包含该目录的递归子目录)中以access开头的文件。

最大目录监控深度

设置日志目录被监控的最大深度,即文件路径中通配符**匹配的最大目录深度。0代表只监控本层目录。

警告

请按最小需要原则配置目录监控深度,过大的目录深度导致Logtail占用更多的监控资源,造成日志采集延迟。

启用容器元信息预览

打开启用容器元信息预览后,您可以在创建Logtail配置后,查看容器元信息,包括匹配容器信息和全量容器信息。

容器过滤

  • Logtail版本

    • Logtail 1.0.34以下版本,只支持通过环境变量容器Label进行容器过滤。

    • Logtail 1.0.34及以上版本,推荐使用Kubernetes层级的信息(K8s Pod名称正则匹配K8s Namespace正则匹配K8s容器名称正则匹配K8s Pod标签白名单等)进行容器过滤。

  • 过滤条件说明

    重要
    • 容器LabelDocker inspect中的Label,不是Kubernetes中的Label。如何获取,请参见获取容器Label

    • 环境变量为容器启动中配置的环境变量信息。如何获取,请参见获取容器环境变量

    1. Kubernetes中的Namespace和容器名称会映射到容器Label中,分别为io.kubernetes.pod.namespaceio.kubernetes.container.name,推荐使用这两个容器Label进行容器过滤。例如,某Pod所属的命名空间为backend-prod,容器名为worker-server,如果您要采集包含该容器的日志,可以设置容器Label白名单为io.kubernetes.pod.namespace : backend-prodio.kubernetes.container.name : worker-server

    2. 如果以上两个容器Label不满足过滤需求,请使用环境变量的黑白名单进行容器过滤。

  • K8s Pod名称正则匹配

    通过Pod名称指定待采集的容器,支持正则匹配。例如设置为^(nginx-log-demo.*)$,表示匹配以nginx-log-demo开头的Pod下的所有容器。

  • K8s Namespace正则匹配

    通过Namespace名称指定采集的容器,支持正则匹配。例如设置为^(default|nginx)$,表示匹配nginx命名空间、default命名空间下的所有容器。

  • K8s容器名称正则匹配

    通过容器名称指定待采集的容器(Kubernetes容器名称是定义在spec.containers中),支持正则匹配。例如设置为^(container-test)$,表示匹配所有名为container-test的容器。

  • 容器label白名单

    通过容器Label白名单指定待采集的容器。

    重要

    请勿设置相同的标签名,如果重名只生效一个。

    • 如果设置了标签名但不设置标签值,则容器Label中包含该标签名的容器都匹配。

    • 如果设置了标签名标签值,则容器Label中包含该标签名:标签值的容器才匹配。

      标签值默认为字符串匹配,即只有标签值和容器Label的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如设置标签名app,设置标签值^(test1|test2)$,表示匹配容器Label中包含app:test1app:test2的容器。

    多个白名单之间为或关系,即只要容器Label满足任一白名单即可被匹配。

  • 容器label黑名单

    通过容器Label黑名单排除不采集的容器。

    重要

    请勿设置相同的标签名,如果重名只生效一个。

    • 如果设置了标签名但不设置标签值,则容器Label中包含该标签名的容器都被排除。

    • 如果设置了标签名标签值,则容器Label中包含该标签名:标签值的容器才会被排除。

      标签值默认为字符串匹配,即只有标签值和容器Label的值完全相同才会被排除。如果该值以^开头并且以$结尾,则为正则匹配。例如设置标签名app,设置标签值^(test1|test2)$,表示排除容器Label中包含app:test1、app:test2的容器。

    多个黑名单之间为或关系,即只要容器Label满足任一黑名单对即可被排除。

  • 环境变量白名单

    通过环境变量白名单指定待采集的容器。

    • 如果设置了环境变量名但不设置环境变量值,则容器环境变量中包含该环境变量名的容器都匹配。

    • 如果设置了环境变量名环境变量值,则容器环境变量中包含该环境变量名和值的容器才匹配。

      环境变量值默认为字符串匹配,即只有环境变量值和环境变量的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置环境变量名NGINX_SERVICE_PORT,设置环境变量值^(80|6379)$,表示可匹配服务端口为80、6379的容器。

    多个白名单之间为或关系,即只要容器的环境变量满足任一键值对即可被匹配。

  • 环境变量黑名单

    通过环境变量黑名单排除不采集的容器。

    • 如果设置了环境变量名但不设置环境变量值,则容器环境变量中包含该环境变量名的容器的日志都将被排除。

    • 如果设置了环境变量名环境变量值,则容器环境变量中包含该环境变量名和值的容器才会被排除。

      环境变量值默认为字符串匹配,即只有环境变量值和环境变量的值完全相同才会被排除。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置环境变量名NGINX_SERVICE_PORT,设置环境变量值^(80|6379)$,表示可排除服务端口为80、6379的容器。

    多个黑名单之间为或关系,即只要容器的环境变量满足任一键值对即可被排除。

  • K8s Pod标签白名单

    通过Kubernetes Pod标签白名单指定待采集的容器。

    • 如果设置了标签名但不设置标签值,则Pod标签中包含该标签名的容器都匹配。

    • 如果设置了标签标签值,则Pod标签中包含该标签名:标签值的容器才匹配。

      标签值默认为字符串匹配,即只有标签值Pod标签的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置标签名environment,设置标签值^(dev|pre)$,表示匹配Pod标签中包含environment:devenvironment:pre的容器。

    多个白名单之间为或关系,即只要Pod标签满足任一键值对即可。

  • K8s Pod标签黑名单

    通过Kubernetes Pod标签黑名单排除不采集的容器。

    • 如果设置了标签名但不设置标签值,则Pod标签中包含该标签名的容器都将被排除。

    • 如果设置了标签标签值,则Pod标签中包含该标签名和标签值的容器才会被排除。

      标签值默认为字符串匹配,即只有标签值Pod标签的值完全相同才会被排除。如果该值以^开头并且以$结尾,则为正则匹配,例如:设置标签名environment,设置标签值^(dev|pre)$,表示排除Pod标签中包含environment:devenvironment:pre的容器。

    多个黑名单之间为或关系,即只要Pod标签满足任一键值对即可被排除。

日志标签富化

环境变量相关tagPod标签相关tag。

文件编码

日志文件的编码格式。

首次采集大小

配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。

  • 首次采集时,如果文件小于1024 KB,则从文件内容起始位置开始采集。

  • 首次采集时,如果文件大于1024 KB,则从距离文件末尾1024 KB的位置开始采集。

您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。

采集黑名单

打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。

重要
  • 如果您在配置日志路径时使用了通配符,但又需要过滤掉其中部分路径,则需在采集黑名单中填写对应的完整路径来保证黑名单配置生效。

    例如您配置日志路径/home/admin/app*/log/*.log,但要过滤/home/admin/app1*目录下的所有子目录,则需选择目录黑名单,配置目录为/home/admin/app1*/** 。如果配置为/home/admin/app1*,黑名单不会生效。

  • 匹配黑名单过程存在计算开销,建议黑名单条目数控制在10条内。

  • 目录路径不能以正斜线(/)结尾,例如将设置路径为/home/admin/dir1/,目录黑名单不会生效。

支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下:

文件路径黑名单

  • 选择文件路径黑名单,配置路径为/home/admin/private*.log,则表示在采集时忽略/home/admin/目录下所有以private开头,以.log结尾的文件。

  • 选择文件路径黑名单,配置路径为/home/admin/private*/*_inner.log,则表示在采集时忽略/home/admin/目录下以private开头的目录内,以_inner.log结尾的文件。例如/home/admin/private/app_inner.log文件被忽略,/home/admin/private/app.log文件被采集。

文件黑名单

选择文件黑名单,配置文件名为app_inner.log,则表示采集时忽略所有名为app_inner.log的文件。

目录黑名单

  • 选择目录黑名单,配置目录为/home/admin/dir1,则表示在采集时忽略/home/admin/dir1目录下的所有文件。

  • 选择目录黑名单,配置目录为/home/admin/dir*,则表示在采集时忽略/home/admin/目录下所有以dir开头的子目录下的文件。

  • 选择目录黑名单,配置目录为/home/admin/*/dir,则表示在采集时忽略/home/admin/目录下二级目录名为dir的子目录下的所有文件。例如/home/admin/a/dir目录下的文件被忽略,/home/admin/a/b/dir目录下的文件被采集。

允许文件多次采集

默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需打开允许文件多次采集开关。

高级参数

Logtail配置的部分参数需要手动输入,请参见创建Logtail流水线配置

  • 配置示例

    image

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

文件编码格式。可选值包括utf8gbk。

TailSizeKB

uint

1024

配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。如果文件大小小于该值,则从头开始采集,取值范围为0~10485760KB。

Multiline

object

多行聚合选项。详见表1。

EnableContainerDiscovery

bool

false

是否启用容器发现功能。仅当LogtailDaemonset模式运行,且采集文件路径为容器内路径时有效。

ContainerFilters

object

容器过滤选项。多个选项之间为“且”的关系,仅当EnableContainerDiscovery取值为true时有效,详见表2。

ExternalK8sLabelTag

map

对于部署于K8s环境的容器,需要在日志中额外添加的与Pod标签相关的tag。map中的keyPod标签名,value为对应的tag名。 例如:在map中添加app: k8s_label_app,则若pod中包含app=serviceA的标签时,会将该信息以tag的形式添加到日志中,即添加字段__tag__:k8s _label_app: serviceA;若不包含app标签,则会添加空字段__tag__:k8s _label_app:

ExternalEnvTag

map

对于部署于K8s环境的容器,需要在日志中额外添加的与容器环境变量相关的tag。map中的key为环境变量名,value为对应的tag名。 例如:在map中添加VERSION: env_version,则当容器中包含环境变量VERSION=v1.0.0时,会将该信息以tag的形式添加到日志中,即添加字段__tag__:env _version: v1.0.0;若不包含VERSION环境变量,则会添加空字段__tag__:env _version:

AppendingLogPositionMeta

bool

false

是否在日志中添加该条日志所属文件的元信息,包括__tag__:__inode__字段和__file_offset__字段。

FlushTimeoutSecs

uint

5

当文件超过指定时间未出现新的完整日志时,将当前读取缓存中的内容作为一条日志输出。

AllowingIncludedByMultiConfigs

bool

false

是否允许当前配置采集其它配置已匹配的文件。

  • 1:多行聚合选项

    参数

    类型

    是否必填

    默认值

    说明

    Mode

    string

    custom

    多行聚合模式。可选值包括customJSON。

    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中的keyPod标签名,valuePod标签的值,说明如下:

    • 如果map中的value为空,则pod标签中包含以key为键的pod都会被匹配;

    • 如果map中的value不为空,则:

      • value^开头并且以$结尾,则当pod标签中存在以key为标签名且对应标签值能正则匹配value的情况时,相应的pod会被匹配;

      • 其他情况下,当pod标签中存在以key为标签名且以value为标签值的情况时,相应的pod会被匹配。

    ExcludeK8sLabel

    map

    对于部署于K8s环境的容器,指定需要排除采集容器所在pod的标签条件。多个条件之间为“或”的关系,如果未添加该参数,则表示采集所有容器。支持正则匹配。 map中的keypod标签名,valuepod标签的值,说明如下:

    • 如果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为标签值的情况时,相应的容器会被匹配。

  • 配置示例

    AliyunPipelineConfig管理采集配置

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的Logtail采集配置名,如果名称重复则不会生效。
      name: example-k8s-file
    spec:
      # 指定目标Project
      project:
        name: k8s-log-test
      logstores:
        # 创建名为 k8s-fileLogstore
        - 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配置页面查看容器元信息以及容器未匹配过滤条件的原因。

  1. Project列表中,单击您在创建Logtail配置所使用的Project。

  2. 日志存储 > 日志库页签中,选择您在创建Logtail配置所使用的Logstore,然后单击Logstore左侧的>,选择数据接入 > Logtail配置

  3. Logtail配置列表中,单击目标Logtail配置。

  4. Logtail配置页面中,单击编辑

  5. 打开启用容器元信息预览开关。

  6. 单击容器元信息预览

  7. 容器预览对话框中,查看容器的元信息。

    • 匹配容器页签中展示匹配您所设置的过滤条件的容器的元信息。

    • 全量容器页签中展示当前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模式

工作原理

  • DaemonSet模式中,Kubernetes集群确保每个节点(Node)只运行一个Logtail容器,用于采集当前节点内所有容器(Containers)的日志。

  • 当新节点加入集群时,Kubernetes集群会自动在新节点上创建Logtail容器;当节点退出集群时,Kubernetes集群会自动销毁当前节点上的Logtail容器。通过DaemonSet的自动扩缩容机制以及标识型机器组,无需您手动管理Logtail实例。

image

Sidecar模式

工作原理

  • Sidecar模式中,每个容器组(Pod)运行一个Logtail容器,用于采集当前容器组(Pod)所有容器(Containers)的日志。不同Pod的日志采集相互隔离。

  • 为了采集同一Pod中其他容器的日志文件,需要通过共享存储卷的方式来完成,即将同一份存储卷分别挂载到业务容器和Logtail容器。关于Sidecar方式采集容器日志的更多信息,请参见Sidecar日志采集介绍Sidecar模式示例。存储卷的更多信息,请参见存储基础知识

image

容器发现

  • 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只支持DockerContainerd两种容器引擎。对于Docker只支持overlay、overlay2这两种存储驱动,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。

  • 存储卷挂载方式:如果NASPVC的方式挂载到数据目录,不支持使用DaemonSet方式部署Logtail,建议使用Sidecar方式或Deployment方式部署Logtail并完成日志采集。具体操作,请参见采集K8s集群文本日志(Sidecar方式部署Logtail)通过业务容器和Logtail容器共享PVC实现日志采集

  • 日志文件路径:

    • 容器内文件路径暂不支持存在软链接,请按实际路径配置采集目录。

    • 如果业务容器的数据目录通过数据卷(Volume)挂载,则填写的文件路径不能短于挂载点路径。例如/var/log/service目录是数据卷挂载的路径,则设置采集目录为/var/log将无法采集该目录下的日志,因为采集目录比挂载路径短。必须设置采集目录为/var/log/service或更深的目录。

  • 日志文件采集停止:

    • docker:当容器被停止时,Logtail会立刻释放容器文件句柄,容器可正常退出。如果在容器停止前,出现因网络延迟、资源占用多等原因导致的采集延时,可能会丢失容器停止前的部分日志。

    • containerd:当容器被停止时,Logtail会持续持有容器内文件的句柄(即保持对日志文件的打开状态),直至所有日志文件内容发送完毕。因此,当出现网络延迟、资源占用多等原因导致的采集延时时,可能会导致业务容器不能及时销毁。