在容器中以DaemonSet模式安装Logtail后,可通过CRD方式创建Logtail采集配置采集容器日志。

前提条件

已安装alibaba-log-controller Helm。更多信息,请参见安装Logtail组件

实现原理

kub-CRD实现原理
CRD的内部工作流程如下:
  1. 使用kubectl或其他工具应用AliyunLogConfig CRD。
  2. alibaba-log-controller监听到CRD配置更新。
  3. alibaba-log-controller根据CRD配置中的内容以及日志服务中Logtail采集配置的状态,自动向日志服务提交创建Logstore、创建Logtail采集配置以及应用机器组的请求。
  4. Logtail定期请求Logtail采集配置所在服务器,获取新的或已更新的Logtail采集配置并进行热加载。
  5. Logtail根据Logtail采集配置采集各个容器上的标准输出或文本日志。
  6. Logtail将采集到的容器日志发送给日志服务。

创建Logtail采集配置

您只需要定义AliyunLogConfig CRD即可创建Logtail采集配置。创建完成后,系统自动应用该Logtail采集配置。如果您要删除Logtail采集配置只需删除对应的CRD资源即可。

  1. 登录Kubernetes集群。
  2. 执行如下命令创建一个yaml文件。

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

    vim cube.yaml
  3. 在yaml文件输入如下脚本,并根据实际情况设置其中的参数。
    注意
    • 请确保configName字段值在日志服务Project中唯一存在。
    • 如果多个CRD关联同一个Logtail采集配置,则删除或修改任意一个CRD均会影响到该Logtail采集配置,导致其他关联该Logtail采集配置的CRD状态与日志服务中Logtail采集配置的状态不一致。
    apiVersion: log.alibabacloud.com/v1alpha1      # 使用默认值,无需修改。
    kind: AliyunLogConfig                          # 使用默认值,无需修改。
    metadata:
      name: simple-stdout-example                  # 设置资源名,在当前Kubernetes集群内唯一。
    spec:
      project: k8s-my-project                      # [可选]设置Project名称。默认为安装Logtail组件时设置的Project。
      logstore: k8s-stdout                         # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      shardCount: 2                                # [可选]设置Shard数量。默认值为2,取值范围1~10。
      lifeCycle: 90                                # [可选]设置Logstore中数据的存储时间,该参数值仅在新建Logstore时生效。默认值为90,取值范围为1~3650。其中,3650天为永久存储。
      logtailConfig:                               # 设置Logtail采集配置。
        inputType: plugin                          # 设置采集的数据源类型。file表示采集文本日志或plugin表示采集标准输出。
        configName: simple-stdout-example          # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
        inputDetail:                               # 设置Logtail采集配置的详细信息,具体配置请参见本文下方的示例。
          ...
    参数 数据类型 是否必填 说明
    project string Project名称。默认为安装Logtail组件时设置的Project。
    logstore string Logstore名称。

    如果您所指定的Logstore不存在,日志服务会自动创建。

    shardCount int Shard数量。默认值为2,取值范围为1~10。
    lifeCycle int Logstore中数据的存储时间。默认值为90,取值范围为1~3650。其中,3650天为永久存储。
    注意 该参数值仅在新建Logstore时生效,即您只能在创建Logstore时,指定数据的存储时间。如果您在logstore参数中指定的Logstore已存在,则修改该参数值,不会生效。
    machineGroups array 机器组。默认为安装Logtail组件时,日志服务自动创建名为k8s-group-${your_k8s_cluster_id}的机器组。
    logtailConfig object Logtail采集配置的详细定义,一般只需要定义其中的inputType参数、configName参数和inputDetail参数。详细参数说明,请参见Logtail配置

    logtailConfig的配置示例请参见Logtail采集配置示例(标准输出)Logtail采集配置示例(文本日志)

  4. 执行如下命令使Logtail采集配置生效。

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

    kubectl apply -f cube.yaml

查看Logtail采集配置

您可以通过CRD方式或控制台方式查看Logtail采集配置,其中控制台方式请参见查看Logtail采集配置
注意 如果您使用的是CRD方式,则您在控制台上对Logtail采集配置的修改不会同步到CRD中,但您在CDR中对Logtail采集配置的修改会同步到控制台。

查看当前Kubernetes集群中所有的Logtail采集配置

您可以执行kubectl get aliyunlogconfigs命令进行查看,返回结果下图所示。查看Logtail采集配置

查看Logtail采集配置的详细信息和状态

您可以执行kubectl get aliyunlogconfigs config_name -o yaml命令进行查看。其中,config_name为Logtail采集配置的名称,请根据实际情况替换。 返回结果如下图所示。

执行结果中的status字段和statusCode字段表示Logtail采集配置的状态。
  • 如果statusCode字段的值为200,表示应用Logtail采集配置成功。
  • 如果statusCode字段的值为非200,表示应用Logtail采集配置失败。
查看logtail采集配置

Logtail采集配置示例(标准输出)

采集容器标准输出时,需将inputType设置为plugin,并将具体信息填写到inputDetail下的plugin字段。具体的参数及其说明请参见通过DaemonSet-控制台方式采集容器标准输出

示例1:通过极简模式采集容器标准输出

通过极简模式采集除环境变量为COLLECT_STDOUT_FLAG=false之外的所有容器的标准输出(stdout和stderr)。其中,您可以登录容器所在的宿主机查看容器的环境变量。具体操作,请参见获取容器环境变量。CRD配置示例如下所示。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # 设置资源名,在当前Kubernetes集群内唯一。
  name: simple-stdout-example
spec:
  # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
  logstore: k8s-stdout
  # 设置Logtail采集配置。
  logtailConfig:
    # 设置采集的数据源类型。采集标准输出时,需设置为plugin。
    inputType: plugin
    # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
    configName: simple-stdout-example
    inputDetail:
      plugin:
        inputs:
          -
            # input type
            type: service_docker_stdout
            detail:
              # 指定采集stdout和stderr。
              Stdout: true
              Stderr: true
              # 设置环境变量黑名单,采集除环境变量为COLLECT_STDOUT_FLAG=false之外的所有容器的标准输出。
              ExcludeEnv:
                COLLECT_STDOUT_FLAG: "false"

示例2:通过极简模式采集容器标准输出,并使用正则模式处理容器标准输出

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

通过极简模式采集容器中Grafana的访问日志,并使用正则模式将其解析为结构化数据。其中,Grafana容器的环境变量为GF_INSTALL_PLUGINS=grafana-piechart-....,您可以登录容器所在的宿主机进行查看。具体操作,请参见获取容器环境变量
  • CRD配置
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: regex-stdout-example
    spec:
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-stdout-regex
      # 设置Logtail采集配置。
      logtailConfig:
        # 设置采集的数据源类型。采集标准输出时,需设置为plugin。
        inputType: plugin
        # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
        configName: regex-stdout-example
        inputDetail:
          plugin:
            inputs:
              -
                # input type
                type: service_docker_stdout
                detail:
                  # 指定只采集标准输出stdout,不采集标准错误stderr。
                  Stdout: true
                  Stderr: false
                  # 设置环境变量白名单,只采集容器环境变量中EnvKey为GF_INSTALL_PLUGINS的容器的标准输出。
                  IncludeEnv:
                    GF_INSTALL_PLUGINS: ''
            processors:
              -
                # 指定正则模式解析所采集到的标准输出。
                type: processor_regex
                detail:
                  # 设置原始字段名。采集到的容器标准输出默认保存在content字段中。
                  SourceKey: content
                  # 设置正则表达式,用于提取日志内容。
                  Regex: 't=(\d+-\d+-\w+:\d+:\d+\+\d+) lvl=(\w+) msg="([^"]+)" logger=(\w+) userId=(\w+) orgId=(\w+) uname=(\S*) method=(\w+) path=(\S+) status=(\d+) remote_addr=(\S+) time_ms=(\d+) size=(\d+) referer=(\S*).*'
                  # 设置提取的字段列表。
                  Keys: ['time', 'level', 'message', 'logger', 'userId', 'orgId', 'uname', 'method', 'path', 'status', 'remote_addr', 'time_ms', 'size', 'referer']
                  # 保留原始字段。
                  KeepSource: true
                  # 出现无匹配的原始字段时会报错。
                  NoKeyError: true
                  # 正则表达式与原始字段的值不匹配时会报错。
                  NoMatchError: true
  • 原始日志
    t=2018-03-09T07:14:03+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=172.16.64.154 time_ms=0 size=29 referer=
  • 解析后的日志采集到的日志数据

Logtail采集配置示例(文本日志)

采集容器文本日志时,需将inputType设置为file,并将具体信息填写到inputDetail内,具体字段及说明请参见通过DaemonSet-控制台方式采集Kubernetes文件

示例1:通过极简模式采集容器文本日志

通过极简模式采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志,日志文件路径为/data/logs/app_1/simple.LOG

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # 设置资源名,在当前Kubernetes集群内唯一。
  name: simple-file-example
spec:
   # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
  logstore: k8s-file
  # 设置Logtail采集配置。
  logtailConfig:
    # 设置采集的数据源类型。采集文本日志时,需设置为file。
    inputType: file
    # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
    configName: simple-file-example
    inputDetail:
      # 指定通过极简模式采集文本日志。
      logType: common_reg_log
      # 设置日志文件所在路径。
      logPath: /data/logs/app_1
      # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
      filePattern: simple.LOG
      # 采集容器的文本日志时,需设置dockerFile为true。
      dockerFile: true
      # 设置环境变量白名单。只采集环境变量中包含采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ""

示例2:通过完整正则模式采集容器文本日志

某JAVA程序日志为多行日志,日志中包含错误堆栈信息。您可以通过完整正则模式进行采集,并在Logtail采集配置中指定置行首正则表达式。

  • 日志样例
    [2018-05-11T20:10:16,000] [INFO] [SessionTracker] [SessionTrackerImpl.java:148] Expiring sessions
    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x8F",...' for column 'data' at row 1
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
    at org.springframework.jdbc.support.AbstractFallbackSQLException
  • CRD配置
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: regex-file-example
    spec:
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-file
      logtailConfig:
        # 设置采集的数据源类型。采集文本日志时,需设置为file。
        inputType: file
        # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
        configName: regex-file-example
        inputDetail:
          # 指定通过完整正则模式采集文本日志。
          logType: common_reg_log
          # 设置日志文件的路径。
          logPath: /app/logs
          # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
          filePattern: error.LOG
          # 设置用于匹配日志行首的行首正则表达式。
          logBeginRegex: '\[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*'
          # 设置正则表达式,用于提取日志内容。
          regex: '\[([^]]+)]\s\[(\w+)]\s\[(\w+)]\s\[([^:]+):(\d+)]\s(.*)'
          # 设置提取的字段列表。
          key : ["time", "level", "method", "file", "line", "message"]
          # 使用完整正则模式采集日志时,默认从日志的time字段中提取时间。如果无需提取时间,可不设置该字段。如果您设置了timeFormat字段,则需配置adjustTimezone字段和logTimezone字段。
          timeFormat: '%Y-%m-%dT%H:%M:%S'
          # 由于Logtail默认工作在零时区,因此需通过如下配置,强制设置时区。
          adjustTimezone: true
          # 设置时区偏移量。日志时间为东八区,如果是其他时区,请调整该值。
          logTimezone: "GMT+08:00"
          # 解析失败时,上传原始日志。
          discardUnmatch: false
          # 采集容器的文本日志时,需设置dockerFile为true。
          dockerFile: true
          # 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ""
  • 采集到的日志样例正则模式

示例3:通过分隔符模式采集容器文本日志

如果您要采集的容器文本日志中有明确的分隔符,您可以使用通过分隔符模式采集容器文本日志。分隔符日志以换行符为边界,每一行都是一条日志。分隔符日志使用分隔符将一条日志分割成多个字段。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # 设置资源名,在当前Kubernetes集群内唯一。
  name: delimiter-file-example
spec:
  # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
  logstore: k8s-file
  logtailConfig:
    # 设置采集的数据源类型。采集文本日志时,需设置为file。
    inputType: file
    configName: delimiter-file-example
    # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
    inputDetail:
      # 指定通过分隔符模式采集日志。
      logType: delimiter_log
      # 设置日志文件的路径。
      logPath: /usr/local/ilogtail
      # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
      filePattern: delimiter_log.LOG
      # 设置分隔符。
      separator: '|&|'
      # 设置提取的字段列表。
      key : ['time', 'level', 'method', 'file', 'line', 'message']
      # 设置时间字段。
      timeKey: 'time'
      # 使用分隔符模式采集日志时,默认从日志的time字段中提取时间。如果无需提取时间,可不设置该字段。如果您设置了timeFormat字段,则需配置adjustTimezone字段和logTimezone字段。
      timeFormat: '%Y-%m-%dT%H:%M:%S'
      # 由于Logtail默认工作在零时区,因此需通过如下配置,强制设置时区。
      adjustTimezone: true
      # 设置时区偏移量。日志时间为东八区,如果是其他时区,请调整该值。
      logTimezone: "GMT+08:00"
      # 解析失败时,上传原始日志。
      discardUnmatch: false
      # 采集容器的文本日志时,需设置dockerFile为true。
      dockerFile: true
      # 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。
      dockerIncludeEnv:
        ALIYUN_LOGTAIL_USER_DEFINED_ID: ''

示例4:通过JSON模式采集容器文本日志

如果您要采集的容器文本日志为Object类型的JSON日志,则您可以使用JSON模式进行采集。

  • 原始日志
    {"url": "POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek********&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1", "ip": "10.200.98.220", "user-agent": "aliyun-sdk-java", "request": {"status": "200", "latency": "18204"}, "time": "05/Jan/2020:13:30:28"}
  • CRD配置
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: json-file-example
    spec:
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-file
      logtailConfig:
        # 设置采集的数据源类型。采集文本日志时,需设置为file。
        inputType: file
        # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
        configName: json-file-example
        inputDetail:
          # 指定通过JSON模式采集日志。
          logType: json_log
          # 设置日志文件的路径。
          logPath: /usr/local/ilogtail
          # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
          filePattern: json_log.LOG
          # 设置时间字段,如果无指定需求,则设置为timeFormat: ''。
          timeKey: 'time'
          # 设置时间格式。如果无指定需求,则设置为timeFormat: ''。
          timeFormat: '%Y-%m-%dT%H:%M:%S'
          # 采集容器的文本日志时,需设置dockerFile为true。
          dockerFile: true
          # 设置环境变量白名单。只采集环境变量中包含EnvKey为ALIYUN_LOGTAIL_USER_DEFINED_ID的容器的文本日志。
          dockerIncludeEnv:
            ALIYUN_LOGTAIL_USER_DEFINED_ID: ""