本文介绍如何在控制台上创建Logtail配置,并以DaemonSet方式采集容器文件日志。

前提条件

  • 已安装Logtail组件。具体操作,请参见安装Logtail组件(Kubernetes集群)
  • 在您安装Logtail组件时所使用的Project中已完成Logstore创建。具体操作,请参见创建Logstore
  • 目标容器持续产生日志。
    重要 Logtail只采集增量日志。如果下发Logtail配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见读取文件

功能特点

Logtail支持将容器产生的文本日志和容器相关的元数据信息一起上传到日志服务。Logtail具备以下功能特点。
  • 采集文本日志时,只需配置容器内的日志文件路径,无需关心该路径到宿主机的映射。
  • 支持通过容器Label白名单指定待采集的容器。
  • 支持通过容器Label黑名单排除不要采集的容器。
  • 支持通过环境变量白名单指定待采集的容器。
  • 支持通过环境变量黑名单排除不要采集的容器。
  • 支持采集多行日志(例如Java Stack日志)。
  • 支持上报容器日志时自动关联Meta信息(例如容器名、镜像、Pod、Namespace、环境变量等)。
  • 当容器运行于Kubernetes时,Logtail还具有以下功能。
    • 支持通过Kubernetes Namespace名称、Pod名称、容器名称指定待采集的容器。
    • 支持通过Kubernetes Label白名单指定待采集的容器。
    • 支持通过Kubernetes Label黑名单排除不要采集的容器。
    • 支持上报容器日志时自动关联Kubernetes Label信息。

限制说明

  • 采集停止策略:当容器被停止后,Logtail监听到容器die的事件后会停止该容器日志的采集。如果此时采集出现延迟,则可能丢失停止前的部分日志。
  • Docker存储驱动限制:目前只支持overlay、overlay2,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。

    如果日志目录是以PVC方式挂载到NAS,则不支持使用Daemonset方式采集日志,建议使用Sidecar方式采集。具体操作,请参见通过Sidecar-CRD方式采集容器文本日志通过Sidecar-控制台方式采集容器文本日志

  • 不支持采集软链接:目前Logtail无法访问业务容器的软链接,请按真实路径配置采集目录。
  • 如果业务容器的数据目录是通过数据卷(Volume)挂载的,则不支持采集它的父目录,需设置采集目录为完整的数据目录。

    例如/var/log/service目录是数据卷挂载的路径,则设置采集目录为/var/log将采集不到该目录下的日志,需设置采集目录为/var/log/service

  • Kubernetes默认将宿主机根目录挂载到Logtail容器的/logtail_host目录。如果您要采集宿主机文本日志,则配置日志文件路径时,需加上/logtail_host前缀。

    例如需要采集宿主机上/home/logs/app_log/目录下的日志,则设置日志路径为/logtail_host/home/logs/app_log/

  • Logtail支持Docker和Containerd两种容器引擎的数据采集,访问路径说明如下:
    • Docker:Logtail通过/run/docker.sock访问Docker,请确保该路径存在且具备访问权限。
    • Containerd:Logtail通过/run/containerd/containerd.sock访问Containerd,请确保该路径存在且具备访问权限。

创建Logtail配置

重要 默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,请参见如何实现文件中的日志被采集多份
  1. 登录日志服务控制台
  2. 接入数据区域,单击Kubernetes-文件
  3. 选择目标Project和Logstore,单击下一步
    选择您在安装Logtail组件时所使用的Project。Logstore为您自定义创建的Logstore。
  4. 单击使用现有机器组
    安装Logtail组件后,日志服务自动创建名为k8s-group-${your_k8s_cluster_id}的机器组,您可以直接使用该机器组。
  5. 选中目标机器组(k8s-group-${your_k8s_cluster_id}),将该机器组从源机器组移动到应用机器组,单击下一步
    重要 如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
  6. 设置Logtail配置,单击下一步
    1. 设置基本信息(例如配置名称、日志路径、采集模式、数据处理插件、过滤器等)。
      上述配置项与采集服务器文本日志的配置相同,配置说明请参见采集文本日志
      说明
      • 采集容器文本日志时,您也需要选择合适的采集模式(例如极简模式、极简模式-多行、完整正则模式、JSON模式、分隔符模式、Nginx模式等),Logtail会根据您所选择的采集模式解析日志。例如您要采集多行日志,可选择极简模式-多行或完整正则模式;您要采集JSON日志,可选择JSON模式。各个采集模式的详细说明,请参见采集模式
      • 当固定的采集模式无法满足日志解析需求时,您可以在Logtail配置中打开启用插件处理开关,添加Logtail插件解析日志。例如添加处理插件提取字段、提取日志时间、脱敏数据、过滤日志等。更多信息,请参见Logtail插件
    2. 打开是否为Docker文件的开关。
    3. 可选:设置容器过滤条件。
      • Logtail 1.0.34以下版本,只支持通过环境变量、容器Label进行容器过滤。详细说明,如下表所示。

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

        重要
        • 容器Label为Docker inspect中的Label,不是Kubernetes中的Label。如何获取,请参见获取容器Label
        • 环境变量为容器启动中配置的环境变量信息。如何获取,请参见获取容器环境变量
        • 请勿设置相同的LabelKey,如果重名只生效一个。
        参数名称参数说明
        Label白名单用于指定待采集的容器。如果您要设置容器Label白名单,那么LabelKey必填,LabelValue可选填。
        • 如果LabelValue为空,则容器Label中包含LabelKey的容器都匹配。
        • 如果LabelValue不为空,则容器Label中包含LabelKey=LabelValue的容器才匹配。

          LabelValue默认为字符串匹配,即只有LabelValue和容器Label的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如:配置LabelKeyio.kubernetes.container.name,配置LabelValue^(nginx|cube)$,表示可匹配名为nginx、cube的容器。

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

        Label黑名单用于排除不采集的容器。如果您要设置容器Label黑名单,那么LabelKey必填,LabelValue可选填。
        • 如果LabelValue为空,则容器Label中包含LabelKey的容器都将被排除。
        • 如果LabelValue不为空,则容器Label中包含LabelKey=LabelValue的容器才会被排除。

          LabelValue默认为字符串匹配,即只有LabelValue和容器Label的值完全相同才会匹配。如果该值以^开头并且以$结尾,则为正则匹配。例如:设置LabelKeyio.kubernetes.container.name,设置LabelValue^(nginx|cube)$,表示可匹配名为nginx、cube的容器。

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

        环境变量白名单用于指定待采集的容器。如果您要设置环境变量白名单,那么EnvKey必填,EnvValue可选填。
        • 如果EnvValue为空,则容器环境变量中包含EnvKey的容器都匹配。
        • 如果EnvValue不为空,则容器环境变量中包含EnvKey=EnvValue的容器才匹配。

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

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

        环境变量黑名单用于排除不采集的容器。如果您要设置环境变量黑名单,那么EnvKey必填,EnvValue可选填。
        • 如果EnvValue为空,则容器环境变量中包含EnvKey的容器的日志都将被排除。
        • 如果EnvValue不为空,则容器环境变量中包含EnvKey=EnvValue的容器才会被排除。

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

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

      • Logtail 1.0.34及以上版本,推荐使用Kubernetes层级的信息(Pod名称、Namespace名称、容器名称、Label)进行容器过滤。

        打开是否部署于K8s开关,选择如下资源进行容器过滤。

        说明 由于在Kubernetes管控类资源(例如Deployment )运行时更改Label,不会重启具体的工作资源Pod,因此Pod无法感知此变更,可能导致匹配规则失效。设置K8s Label黑白名单时,请以Pod中的Kubernetes 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的容器。
        K8s Label白名单通过Kubernetes Label白名单指定待采集的容器。如果您要设置Kubernetes Label白名单,那么LabelKey必填,LabelValue可选填。
        • 如果LabelValue为空,则Kubernetes Label中包含LabelKey的容器都匹配。
        • 如果LabelValue不为空,则Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。

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

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

        K8s Label黑名单通过Kubernetes Label黑名单排除不采集的容器。如果您要设置Kubernetes Label黑名单,那么LabelKey必填,LabelValue可选填。
        • 如果LabelValue为空,则Kubernetes Label中包含LabelKey的容器都被排除。
        • 如果LabelValue不为空,则Kubernetes Label中包含LabelKey=LabelValue的容器才会被排除。

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

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

    4. 可选:设置日志标签。

      如果您使用的是Logtail 1.0.34及以上版本,您可以将环境变量和Kubernetes Label添加到日志,作为日志标签。

      参数名称参数说明
      环境变量日志标签设置环境变量日志标签后,日志服务将在日志中新增环境变量相关字段。例如设置EnvKeyVERSION,设置EnvValueenv_version,当容器中包含环境变量VERSION=v1.0.0时,会将该信息添加到日志中,即添加字段__tag__:__env_version__: v1.0.0
      K8s Label日志标签设置Kubernetes Label日志标签后,日志服务将在日志中新增Kubernetes Label相关字段。例如设置LabelKeyapp,设置LabelValuek8s_label_app,当Kubernetes中包含Label app=serviceA时,会将该信息添加到日志中,即添加字段__tag__:__k8s_label_app__: serviceA
  7. 预览数据及创建索引,然后单击下一步
    日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引
    重要 如果您要查询和分析日志,那么全文索引和字段索引必须至少启用一种。同时启用时,以字段索引为准。
  8. 单击查询日志,系统将跳转至Logstore查询分析页面。
    您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志

配置示例

通过环境变量黑白名单过滤容器

采集环境变量为NGINX_SERVICE_PORT=80且不为POD_NAMESPACE=kube-system的容器的文本日志,日志文件路径为/var/log/nginx/access.log,采集模式为极简模式

  1. 获取环境变量。

    您可以登录容器所在的宿主机查看容器的环境变量。具体操作,请参见获取容器环境变量

    environment 配置方式示例
  2. 创建Logtail配置。
    Logtail配置示例如下图所示。极简模式的相关配置说明请参见使用极简模式采集日志数据源配置示例

通过容器Label黑白名单过滤容器

采集容器Label为io.kubernetes.container.name=nginx的容器的文本日志,日志文件路径为/var/log/nginx/access.log,采集模式为极简模式

  1. 获取容器Label。

    您可以登录容器所在的宿主机查看容器的Label。具体操作,请参见获取容器Label

    label方式示例
  2. 创建Logtail配置。
    Logtail配置示例如下图所示。极简模式的相关配置说明请参见使用极简模式采集日志数据源设置

通过Kubernetes Namespace名称、Pod名称和容器名称过滤容器

采集default命名空间下以nginx-log-demo开头的Pod中的nginx-log-demo-0容器的文本日志。

  1. 获取Kubernetes层级的信息。
    • 获取Pod信息。k8s资源
    • 获取Namespace等信息。K8s资源
  2. 创建Logtail配置。

    Logtail配置示例如下图所示。极简模式的相关配置说明请参见使用极简模式采集日志

    Logtail采集配置

通过Kubernetes Label过滤容器

采集Kubernetes Label中Key为job-name,Value以nginx-log-demo开头的所有容器中的文本日志。

  1. 获取Kubernetes Label。K8s资源
  2. 创建Logtail配置。
    Logtail配置示例如下图所示。极简模式的相关配置说明请参见使用极简模式采集日志Logtail配置

采集多行日志

采集Kubernetes Label中Key为job-name,Value以nginx-log-demo开头的所有容器中的文本日志,且该日志为多行日志。采集模式为极简模式-多行

  1. 获取Kubernetes Label。K8s资源
  2. 创建Logtail配置。
    Logtail配置示例如下图所示。极简模式(多行)的相关配置说明请参见使用极简模式采集日志容器多行日志

默认字段

每条容器文本日志默认包含的字段如下表所示。
字段名称说明
_image_name_镜像名
_container_name_容器名
_pod_name_Pod名
_namespace_Pod所在的命名空间
_pod_uid_Pod的唯一标识
_container_ip_Pod的IP地址

问题排查

当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。

如何排查容器日志采集异常