通过DaemonSet方式采集Kubernetes容器文本日志

重要

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

如果您需要采集ACK集群的容器文本日志,可以通过DaemonSet的方式进行采集,以在每个节点上自动运行一个日志代理,提升运维效率。在ACK集群中,您可以安装日志组件Logtail,该组件会在节点上部署一个Logtail实例,用于收集节点上所有容器的日志,便于后续的管理和分析。

工作原理

image

DaemonSet模式

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

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

容器发现

  • 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组件

Logtail是SLS提供的日志采集Agent,支持无侵入式采集ACK集群中产生的日志。您无需修改应用程序代码,Logtail采集日志时不会影响您的应用程序运行。您可以在ACK集群中安装Logtail组件,安装完成后,Logtail会自动部署logtail-ds DaemonSet,用于采集节点的日志。

重要
  • 请确保仅使用一款日志采集工具例如Logtail,来采集并发送容器日志到SLS。同时使用这两个组件可能会导致容器日志被重复采集和发送,带来额外的费用和资源消耗。

  • 升级Logtail、查看Logtail版本及IP地址、查看Logtail的运行日志等操作步骤,请参见安装Logtail组件(阿里云Kubernetes集群)

创建集群时安装

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏,单击集群

  3. 集群列表页面中,单击页面右上角的创建集群

    以下仅介绍开启日志服务的关键步骤。关于创建集群的具体操作,请参见创建ACK托管集群

  4. 组件配置配置项页中,选中使用日志服务,表示在新建的Kubernetes集群中安装日志插件。

    当选中使用日志服务后,会出现创建项目(Project)的提示。关于日志服务管理日志的组织结构,请参见项目(Project)。有以下两种创建Project的方式。

    • 单击使用已有Project,选择一个现有的Project来管理采集的日志。

      image..png

    • 单击创建新Project,自动创建一个新的Project来管理采集的日志,Project会自动命名为k8s-log-{ClusterID},其中,ClusterID是您新建的Kubernetes集群的唯一标识。

      image..png

  5. 配置完成后,单击右下角的创建集群,在弹出的窗口中单击确定,完成创建。

    完成创建后,您可在集群列表页面查看开启了Logtail的ACK集群。

为已有集群安装

  1. 登录容器服务管理控制台

  2. 在控制台左侧导航栏,单击集群

  3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

  4. 在集群管理页左侧导航栏中,选择运维管理>组件管理,并在日志与监控区域找到logtail-ds

  5. logtail-ds组件右侧,单击安装,并在安装组件对话框中单击确定

如果您已安装的日志服务组件为旧版本,可以在logtail-ds组件右侧,单击升级

重要

升级logtail-ds组件后,会重置组件参数。如果您曾自定义logtail-ds或alibaba-log-controller的配置和环境变量,参数将被覆盖,请重新配置。具体操作,请参见手动升级

步骤二:配置Logtail采集配置

  1. 建议您只选择以下一种方式配置Logtail采集配置。

    • CRD:可以通过Kubernetes的工具进行批量配置和版本控制,适合集中管理多个Logtail采集配置。通过CRD创建的Logtail采集配置不会同步到控制台,因此如需修改这些配置,必须直接修改CRD资源,不要直接在控制台操作,否则导致Logtail采集配置不一致。

    • 日志服务控制台:适合少量Logtail采集配置的创建和管理,无需登录Kubernetes集群,操作步骤简单但无法批量配置,配置的优先级低于CRD。

    • 环境变量:只支持单行文本,如果要配置多行文本或其他日志格式,必须使用CRD或在日志服务控制台配置。

  2. Logtail采集配置项包括:是否过滤某些容器、是否忽略指定的目录或文件(采集黑名单)、是否允许文件多次采集等。

(推荐)CRD-AliyunPipelineConfig

创建Logtail采集配置

警告

使用AliyunPipelineConfig,需要日志组件版本最低为0.5.1。

您只需要创建AliyunPipelineConfig CR即可创建iLogtail采集配置,创建完成后自动生效。对于通过CR创建的iLogtail采集配置,其修改只能通过更新相应的CR来实现。

  1. 获取集群KubeConfig并通过kubectl工具连接集群

  2. 执行如下命令创建一个YAML文件。

    cube.yaml为文件名,请根据实际情况替换。

    vim cube.yaml
  3. 在YAML文件输入如下脚本,并根据实际情况设置其中的参数。

    重要
    • 请确保configName字段值在安装Logtail组件的Project中唯一。

    • 每个iLogtail采集配置必须单独设置一个对应的CR,如果多个CR关联同一个Logtail配置,后配置的CR将不会生效。

    • AliyunPipelineConfig的参数,请参见【推荐】使用AliyunPipelineConfig管理采集配置。本文的iLogtail采集配置样例包含基础的文本日志采集功能,参数说明参见CreateLogtailPipelineConfig - 创建Logtail流水线配置

    • 请确保config.flushers.Logstore参数配置的Logstore已存在,可以通过配置spec.logstore参数自动创建Logstore。

    采集指定容器内的单行文本日志

    创建名为example-k8s-file的iLogtail采集配置,对于集群内名称包含app的所有容器,以单行文本模式采集/data/logs/app_1路径下的test.LOG文件,

    直接发送到名称为k8s-file的Logstore,该Logstore属于名称为k8s-log-test的Project。

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 创建一个 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名
      name: example-k8s-file
    spec:
      # 指定目标project
      project:
        name: k8s-log-test
      # 创建用于存储日志的 Logstore
      logstores:
        - name: k8s-file
      # 定义iLogtail采集配置
      config:
        # 定义输入插件
        inputs:
          # 使用input_file插件采集容器内文本日志
          - Type: input_file
            # 容器内的文件路径
            FilePaths:
              - /data/logs/app_1/**/test.LOG
            # 启用容器发现功能。
            EnableContainerDiscovery: true
            # 添加容器信息过滤条件,多个选项之间为“且”的关系。
            ContainerFilters:
              # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。
              K8sNamespaceRegex: default
              # 指定待采集容器的名称,支持正则匹配。
              K8sContainerRegex: ^(.*app.*)$
        # 定义输出插件
        flushers:
          # 使用flusher_sls插件输出到指定Logstore。
          - Type: flusher_sls
            # 需要确保该 Logstore 存在
            Logstore: k8s-file
            # 需要确保 endpoint 正确
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs

    采集所有容器内的多行文本日志并正则解析

    创建名为example-k8s-file的iLogtail采集配置,以多行文本模式采集集群内所有容器内的/data/logs/app_1路径下的test.LOG文件,对采集到的数据进行JSON解析,直接发送到名称为k8s-file的Logstore,该Logstore属于名称为k8s-log-test的Project。

    下面样例中的日志原文通过input_file插件读取后格式为{"content": "2024-06-19 16:35:00 INFO test log\nline-1\nline-2\nend"},会被正则解析插件解析为{"time": "2024-06-19 16:35:00", "level": "INFO", "msg": "test log\nline-1\nline-2\nend"}

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 创建一个 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名
      name: example-k8s-file
    spec:
      # 指定目标project
      project:
        name: k8s-log-test
      # 创建用于存储日志的 Logstore
      logstores:
        - name: k8s-file
      # 定义iLogtail采集配置
      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
            # 开启多行能力
            Multiline:
              # 选择自定义行首正则表达式模式
              Mode: custom
              # 配置行首正则表达式
              StartPattern: \d+-\d+-\d+.*
        # 定义处理插件
        processors:
          # 使用正则解析插件解析日志
          - Type: processor_parse_regex_native
            # 源字段名
            SourceKey: content
            # 解析用的正则表达式,用捕获组"()"捕获待提取的字段
            Regex: (\d+-\d+-\d+\s*\d+:\d+:\d+)\s*(\S+)\s*(.*)
            # 提取的字段列表
            Keys: ["time", "level", "msg"]
        # 定义输出插件
        flushers:
          # 使用flusher_sls插件输出到指定Logstore。
          - Type: flusher_sls
            # 需要确保该 Logstore 存在
            Logstore: k8s-file
            # 需要确保 endpoint 正确
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs
  4. 执行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的文本日志,并发送到日志服务中。

    cube.yaml为文件名,请根据实际情况替换。

    kubectl apply -f cube.yaml
    重要

    采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引

CRD-AliyunLogConfig

您只需要创建AliyunLogConfig CR即可创建iLogtail采集配置,创建完成后自动生效。对于通过CR创建的iLogtail采集配置,其修改只能通过更新相应的CR来实现。

  1. 获取集群KubeConfig并通过kubectl工具连接集群

  2. 执行如下命令创建一个YAML文件。

    cube.yaml为文件名,请根据实际情况替换。

    vim cube.yaml
  3. 在YAML文件输入如下脚本,并根据实际情况设置其中的参数。

    重要
    • 请确保configName字段值在安装Logtail组件的Project中唯一。

    • 如果多个CR关联同一个iLogtail采集配置,则删除或修改任意一个CR均会影响到该iLogtail采集配置,导致其他关联该iLogtail采集配置的CR状态与日志服务中iLogtail采集配置的状态不一致。

    • CR字段的格式请参见使用AliyunLogConfig管理采集配置。本文的iLogtail采集配置样例包含基础的文本日志采集功能,具体参数参见CreateConfig - 创建Logtail采集配置

    采集指定容器内的单行文本日志

    “创建名为example-k8s-file的iLogtail采集配置,以单行文本模式采集集群内所有名称开头为app的Pod的容器内的/data/logs/app_1路径下的test.LOG文件,直接发送到名称为k8s-file的Logstore,该Logstore属于名称为k8s-log-test的Project。”

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: example-k8s-file
      namespace: kube-system
    spec:
      # 设置目标project名称(可不填写,默认为k8s-log-<your_cluster_id>)
      project: k8s-log-test
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-file
      # 设置iLogtail采集配置。
      logtailConfig:
        # 设置采集的数据源类型。采集文本日志时,需设置为file。
        inputType: file
        # 设置iLogtail采集配置的名称。
        configName: example-k8s-file
        inputDetail:
          # 指定通过极简模式采集文本日志。
          logType: common_reg_log
          # 设置日志文件所在路径。
          logPath: /data/logs/app_1
          # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
          filePattern: test.LOG
          # 采集容器的文本日志时,需设置dockerFile为true。
          dockerFile: true
          #设置容器过滤条件。
          advanced:
            k8s:
              K8sPodRegex: '^(app.*)$'
  4. 执行如下命令使其iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的文本日志,并发送到日志服务中。

    cube.yaml为文件名,请根据实际情况替换。

    kubectl apply -f cube.yaml
    重要

    采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引

日志服务控制台

  1. 登录日志服务控制台

  2. 单击控制台右侧的快速接入数据,在接入数据区域单击Kubernetes-文件卡片。

    image

  3. 选择目标Project和Logstore,单击下一步。选择您在安装Logtail组件时所使用的Project。Logstore为您自定义创建的Logstore。

  4. 机器组配置页面。

    1. 根据实际场景,单击以下页签:

      • K8s场景 > ACK Daemonset

      • K8s场景 > 自建集群Daemonset

        重要

        不同页签的后续配置步骤不同,请根据实际需求正确选择。

    2. 确认目标机器组已在应用机器组列表中,然后单击下一步。在ACK中安装Logtail组件后,日志服务自动创建名为k8s-group-${your_k8s_cluster_id}的机器组,您可以直接使用该机器组。

      重要
      • 如果需要新建机器组,请单击创建机器组,按照右侧面板进行创建。更多信息,请参见通过控制台配置

      • 如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。

  5. 创建Logtail采集配置,单击下一步创建Logtail采集配置,日志服务开始采集日志。

    说明

    Logtail采集配置生效时间最长需要3分钟,请耐心等待。

    全局配置

    配置项

    说明

    配置名称

    Logtail配置名称,在其所属Project内必须唯一。创建Logtail配置成功后,无法修改其名称。

    日志主题类型

    选择日志主题(Topic)的生成方式。更多信息,请参见日志主题

    • 机器组Topic:设置为机器组的Topic属性,用于明确区分不同机器组产生的日志。

    • 文件路径提取:设置为文件路径正则,则需要设置自定义正则,用正则表达式从路径里提取一部分内容作为Topic。用于区分不同源产生的日志。

    • 自定义:自定义日志主题。

    高级参数

    其它可选的与配置全局相关的高级功能参数,请参见创建Logtail流水线配置

    输入配置

    参数名称

    说明

    Logtail部署模式

    Logtail部署模式,选择DaemonSet。

    文件路径类型

    选择待采集的文件路径是容器内路径或宿主机路径。对于通过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标签白名单等)进行容器过滤。

    • 过滤条件说明

      重要
      • 容器Label为Docker 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标签满足任一键值对即可被排除。

    日志标签富化

    环境变量相关tag和Pod标签相关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流水线配置

    处理配置

    配置项

    说明

    日志样例

    待采集日志的样例,请务必使用实际场景的日志。日志样例可协助您配置日志处理相关参数,降低配置难度。支持添加多条样例,总长度不超过1500个字符。

    [2023-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
        at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
        at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
        at TestPrintStackTrace.main(TestPrintStackTrace.java:16)

    多行模式

    • 多行日志的类型:多行日志是指每条日志分布在连续的多行中,需要从日志内容中区分出每一条日志。

      • 自定义:通过行首正则表达式区分每一条日志。

      • 多行JSON:每个JSON对象被展开为多行,例如:

        {
          "name": "John Doe",
          "age": 30,
          "address": {
            "city": "New York",
            "country": "USA"
          }
        }
    • 切分失败处理方式:

      Exception in thread "main" java.lang.NullPointerException
          at com.example.MyClass.methodA(MyClass.java:12)
          at com.example.MyClass.methodB(MyClass.java:34)
          at com.example.MyClass.main(MyClass.java:½0)

      对于以上日志内容,如果日志服务切分失败:

      • 丢弃:直接丢弃这段日志。

      • 保留单行:将每行日志文本单独保留为一条日志,保留为一共四条日志。

    处理模式

    处理插件组合,包括原生插件拓展插件。有关处理插件的更多信息,请参见处理插件概述

    重要

    处理插件的使用限制,请以控制台页面的提示为准。

    • 2.0版本的Logtail:

      • 原生处理插件可任意组合。

      • 原生处理插件和扩展处理插件可同时使用,但扩展处理插件只能出现在所有的原生处理插件之后。

    • 低于2.0版本的Logtail:

      • 不支持同时添加原生插件和扩展插件。

      • 原生插件仅可用于采集文本日志。使用原生插件时,须符合如下要求:

        • 第一个处理插件必须为正则解析插件、分隔符模式解析插件、JSON解析插件、Nginx模式解析插件、Apache模式解析插件或IIS模式解析插件。

        • 从第二个处理插件到最后一个处理插件,最多包括1个时间解析处理插件,1个过滤处理插件和多个脱敏处理插件。

      • 对于解析失败时保留原始字段解析成功时保留原始字段参数,只有以下组合有效,其余组合无效。

        • 只上传解析成功的日志:

          image

        • 解析成功时上传解析后的日志,解析失败时上传原始日志:

          image

        • 解析成功时不仅上传解析后的日志,并且追加原始日志字段,解析失败时上传原始日志。

          例如,原始日志"content": "{"request_method":"GET", "request_time":"200"}"解析成功,追加原始字段是在解析后日志的基础上再增加一个字段,字段名为重命名的原始字段(如果不填则默认为原始字段名),字段值为原始日志{"request_method":"GET", "request_time":"200"}

          image

  6. 创建索引预览数据,然后单击下一步。日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引

    重要

    如果需要查询日志中的所有字段,建议使用全文索引。如果只需查询部分字段、建议使用字段索引,减少索引流量。如果需要对字段进行分析(SELECT语句),必须创建字段索引。

  7. 单击查询日志,系统将跳转至Logstore查询分析页面。

    您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志

环境变量

1. 创建应用时配置日志服务

通过控制台配置

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面上方的命名空间下拉框中设置命名空间,然后单击页面右上角的使用镜像创建

  4. 应用基本信息页签,设置应用名称副本数量类型,单击下一步,进入容器配置页面。

    以下仅介绍日志服务相关的配置。关于其他的应用配置,请参见创建无状态工作负载Deployment

  5. 日志配置区域,配置日志相关信息。

    1. 设置采集配置

      单击+图标创建新的采集配置,每个采集配置由日志库容器内日志路径两项构成。

      • 日志库:配置Logstore名称,用于指定所采集的日志存储于该Logstore。如果该Logstore不存在,ACK将会自动为您在集群关联的日志服务Project下创建相应的Logstore。

        说明

        新创建的Logstore中的日志默认保存时间为90天。

      • 容器内日志路径:指定希望采集的日志所在的路径,例如使用/usr/local/tomcat/logs/catalina.*.log来采集Tomcat的文本日志。

        说明

        指定为stdout时,表示采集容器的标准输出和标准错误输出。

        每一项采集配置都会被自动创建为对应Logstore的一个采集配置,默认采用极简模式(按行)进行采集。如果您需要更丰富的采集方式,请参见通过DaemonSet方式采集Kubernetes容器文本日志通过DaemonSet方式采集Kubernetes容器标准输出(旧版)

      采集配置

    2. 设置自定义Tag

      单击+图标创建新的自定义Tag,每一个自定义Tag都是一个键值对,会拼接到所采集到的日志中,您可以使用它来为容器的日志数据进行标记,例如版本号。

      自定义tag

  6. 当完成所有配置后,可单击右上角的下一步进入后续流程。

    后续操作,可参见创建无状态工作负载Deployment

通过YAML模板

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面上方的命名空间下拉框中设置命名空间,然后单击页面右上角的使用YAML创建资源

  4. 配置YAML文件。

    YAML模板的语法同Kubernetes语法,但是为了给容器指定采集配置,需要使用env来为容器增加采集配置自定义Tag,并根据采集配置,创建对应的volumeMountsvolumes。以下是一个简单的Pod示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-demo
    spec:
      containers:
      - name: my-demo-app
        image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest'
        env:
        # 配置环境变量
        - name: aliyun_logs_log-stdout
          value: stdout
        - name: aliyun_logs_log-varlog
          value: /var/log/*.log
        - name: aliyun_logs_mytag1_tags
          value: tag1=v1
        # 配置volume mount
        volumeMounts:
        - name: volumn-sls-mydemo
          mountPath: /var/log
        # 如果Pod不断重启,启动参数可以添加sleep
        command: ["sh", "-c"]  # 使用 shell 来运行命令
        args: ["sleep 3600"]   # 设置休眠时间为 1 小时(3600 秒)
      volumes:
      - name: volumn-sls-mydemo
        emptyDir: {}

    根据您的需求,按照以下顺序进行配置。

    说明

    如果您有更多的日志采集需求,请参见2. 配置环境变量的高级参数

    1. 通过环境变量来创建您的采集配置自定义Tag,所有与配置相关的环境变量都采用aliyun_logs_作为前缀。

      • 创建采集配置的规则如下:

        - name: aliyun_logs_log-stdout
          value: stdout
        - name: aliyun_logs_log-varlog
          value: /var/log/*.log                        

        示例中创建了两个采集配置,格式为aliyun_logs_{key},对应的{key}分别为log-stdoutlog-varlog

        • aliyun_logs_log-stdout:该env表示创建一个名为log-stdoutLogstore,日志采集路径为stdout的配置,对应的日志服务采集配置名称也是log-stdout,目的是将容器的标准输出采集到log-stdout这个Logstore中。

        • aliyun_logs_log-varlog:该env表示创建一个Logstore名为log-varlog,日志采集路径为/var/log/*.log的配置,对应的日志服务采集配置名称也是log-varlog,目的是将容器的/var/log/*.log文件内容采集到log-varlog这个Logstore中。

      • 创建自定义Tag的规则如下:

        - name: aliyun_logs_mytag1_tags
          value: tag1=v1                       

        配置Tag后,当采集到该容器的日志时,会自动附加对应的字段到日志服务。其中mytag1任意不包含'_'的名称

    2. 如果您的采集配置中指定了非stdout的采集路径,需要在此部分创建相应的volumeMounts

      示例中采集配置添加了对/var/log/*.log的采集,因此相应地添加了/var/log的volumeMounts

  5. 当YAML编写完成后,单击创建,即可将相应的配置交由Kubernetes集群执行。

2. 配置环境变量的高级参数

通过容器环境变量配置采集支持多种配置参数。您可以根据实际需求设置高级参数,以满足日志采集的特殊需求。

重要

通过容器环境变量配置采集日志的方式不适用于边缘场景。

字段

说明

示例

注意事项

aliyun_logs_{key}

  • 必选项。{key}只能包含小写字母、数字和-。

  • 若不存在aliyun_logs_{key}_logstore,则默认创建并采集到名为{key}的logstore。

  • 当值为stdout时表示采集容器的标准输出;其他值为容器内的日志路径。

  • - name: aliyun_logs_catalina
    
      value: stdout
  • - name: aliyun_logs_access-log
    
      value: /var/log/nginx/access.log

aliyun_logs_{key}_tags

可选。值为{tag-key}={tag-value}类型,用于对日志进行标识。

- name: aliyun_logs_catalina_tags

  value: app=catalina

不涉及。

aliyun_logs_{key}_project

可选。值为指定的日志服务Project。当不存在该环境变量时,为您安装时所选的Project。

- name: aliyun_logs_catalina_project

  value: my-k8s-project

Project需与您的Logtail工作所在的Region一致。

aliyun_logs_{key}_logstore

可选。值为指定的日志服务Logstore。当不存在该环境变量时,Logstore和{key}一致。

- name: aliyun_logs_catalina_logstore

  value: my-logstore

不涉及。

aliyun_logs_{key}_shard

可选。值为创建Logstore时的shard数,取值范围为[1 , 10]。当不存在该环境变量时,值为2。

说明

若logstore已经存在,则该参数不生效。

- name: aliyun_logs_catalina_shard

  value: '4'

不涉及。

aliyun_logs_{key}_ttl

可选。值为指定的日志保存时间,取值范围为[1 , 3650]。

  • 当取值为3650时,指定日志的保存时间为永久保存。

  • 当不存在该环境变量时,默认指定日志的保存时间为90天。

说明

若Logstore已经存在,则该参数不生效。

- name: aliyun_logs_catalina_ttl

  value: '3650'

不涉及。

aliyun_logs_{key}_machinegroup

可选。值为应用的机器组。当不存在该环境变量时与安装Logtail的默认机器组一致。关于该参数的详细使用方法,请参见下文的定制需求2:将不同应用数据采集到不同的Project

- name: aliyun_logs_catalina_machinegroup

  value: my-machine-group

不涉及。

aliyun_logs_{key}_logstoremode

可选。值为指定的日志服务Logstore的类型,不指定该参数的话,默认值为standard,取值:

说明

若Logstore已经存在,则该参数不生效。

  • standard:支持日志服务一站式数据分析功能,适用于实时监控、交互式分析以及构建完整的可观测性系统等场景。

  • query:支持高性能查询,索引流量费用约为standard的一半,但不支持SQL分析,适用于数据量大、存储周期长(周、月级别以上)、无日志分析的场景。

  • - name: aliyun_logs_catalina_logstoremode
      value: standard 
  • - name: aliyun_logs_catalina_logstoremode
      value: query 

该参数需要logtail-ds镜像版本>=1.3.1。

  • 定制需求1:将多个应用数据采集到同一Logstore

    如果您需要将多个应用数据采集到同一Logstore,可以设置 aliyun_logs_{key}_logstore参数,例如以下配置将2个应用的stdout采集到stdout-logstore中。

    示例中应用1的{key}app1-stdout,应用2的{key}app2-stdout

    应用1设置的环境变量为:

    # 配置环境变量
        - name: aliyun_logs_app1-stdout
          value: stdout
        - name: aliyun_logs_app1-stdout_logstore
          value: stdout-logstore

    应用2设置的环境变量为:

    # 配置环境变量
        - name: aliyun_logs_app2-stdout
          value: stdout
        - name: aliyun_logs_app2-stdout_logstore
          value: stdout-logstore
  • 定制需求2:将不同应用数据采集到不同的Project

    如果您需要将不同应用的数据采集到多个Project中,您需要进行以下操作:

    1. 在每个Project中创建一个机器组,选择自定义标识,标识名为k8s-group-{cluster-id},其中{cluster-id}为您的集群ID,机器组名称可以自定义配置。

    2. 在每个应用的环境变量中配置project、logstore、machinegroup信息,其中机器组名称为您在上一步创建的机器组名。

      如下示例中应用1的{key}app1-stdout,应用2的{key}app2-stdout。其中如果两个应用在同一个K8s集群中,对应的machinegroup可以使用同一个machinegroup。

      应用1设置的环境变量为:

      # 配置环境变量
          - name: aliyun_logs_app1-stdout
            value: stdout
          - name: aliyun_logs_app1-stdout_project
            value: app1-project
          - name: aliyun_logs_app1-stdout_logstore
            value: app1-logstore
          - name: aliyun_logs_app1-stdout_machinegroup
            value: app1-machine-group

      应用2设置的环境变量为:

      # 应用2 配置环境变量
          - name: aliyun_logs_app2-stdout
            value: stdout
          - name: aliyun_logs_app2-stdout_project
            value: app2-project
          - name: aliyun_logs_app2-stdout_logstore
            value: app2-logstore
          - name: aliyun_logs_app2-stdout_machinegroup
            value: app1-machine-group

步骤三:查询分析日志

Logtail采集到的容器日志会存储在SLS Logstore中。您可以在日志服务控制台查看,也可以在ACK控制台查看。查询语法的介绍,请参见查询与分析概述

ACK控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 日志中心

  3. 日志中心页面,单击应用日志页签,设置检索条件后单击选择日志库,查看应用容器的相关日志。

SLS控制台

  1. 安装成功后,进入日志服务控制台

  2. 在进入控制台后,在Project列表区域选择Kubernetes集群对应的Project(默认为k8s-log-{Kubernetes集群ID}),进入日志库列表页签。

  3. 在列表中找到相应的Logstore(采集配置中指定),将鼠标悬浮在相应的Logstore名称的右侧,单击button图标,并单击查询分析

    本例中,在日志查询页面,您可以查看Tomcat应用的标准输出日志和容器内文本日志,并可以发现自定义tag附加到日志字段中。

容器日志文本默认字段

每条容器文本日志默认包含的字段如下表所示。

字段名称

说明

__tag__:__hostname__

容器宿主机的名称。

__tag__:__path__

容器内日志文件的路径。

__tag__:_container_ip_

容器的IP地址。

__tag__:_image_name_

容器使用的镜像名称。

__tag__:_pod_name_

Pod的名称。

__tag__:_namespace_

Pod所属的命名空间。

__tag__:_pod_uid_

Pod的唯一标识符(UID)。

相关文档