更新时间:2025-08-15 GMT+08:00

日志采集

CCI 2.0利用LTS日志服务采集应用日志并上报LTS,可以协助您排查和诊断问题。

日志采集可靠性说明

日志系统的核心功能在于记录业务组件的全生命周期状态数据(包括启动初始化、退出、运行时信息及异常事件等),主要服务于组件运行状态查看与故障根因分析等运维场景。

请注意标准输出流(stdout/stderr)及本地日志文件采用非持久化存储机制,其数据完整性受制于以下风险因素:

  • 日志轮转压缩机制可能触发历史文件清除。
  • Kubernetes Pod实例终止导致的临时存储卷回收。
  • 节点存储空间限制触发的操作系统自动清理。

尽管云原生日志采集插件通过多级缓冲、优先级队列、断点续传等机制优化采集可靠性,但在以下场景仍存在日志采集丢失的可能:

  • 业务日志吞吐量超过采集端处理能力。
  • 业务Pod终止并立即被容器引擎回收。
  • 日志采集器Pod运行异常。

以下是基于云原生日志管理的最佳实践建议,请您认真考虑并采纳:

  • 请通过专用高可靠性通道记录并持久化关键业务数据(如金融交易)。
  • 请勿在日志中进行记录客户信息、支付凭证、会话令牌等敏感数据。

约束与限制

  • 不支持指定系统、设备、cgroup、tmpfs等挂载目录的日志采集。
  • 对于单行过长的日志(当前配置为250KB)会直接跳过采集。
  • 只支持完整路径和文件名正则匹配,不支持路径正则匹配。
  • 同一个容器中所有需要采集的日志文件名不能重复,若重复只会采集到其中一个日志文件的日志。
  • Pod启动后不支持配置更新,即配置更新后关联的Pod需重启后配置才能生效。
  • 文件所在目录需要容器启动前存在,不支持启动后创建的目录及下层日志文件的日志上报。
  • 日志文件的文件名,最大长度为190字符,超过长度限制的日志文件将不会被采集。
  • 当前暂不支持initcontainer日志采集。
  • 鲲鹏实例暂不支持日志采集。

步骤一 创建日志组

  1. 登录管理控制台,选择“管理与部署 > 云日志服务 LTS”,进入“日志管理”页面。
  2. 登录云日志服务控制台
  3. 进入“日志管理”页面,单击“创建日志组”。
  4. 在“创建日志组”页面中,参考表1填写日志组相关信息。

    表1 日志组参数说明

    参数

    说明

    日志组名称

    日志组是云日志服务进行日志管理的基本单位,用于对日志流进行分类。如果日志较多,需要分门别类,建议您为日志组做好命名,方便后续快速查找日志。

    LTS会自动生成一个默认的日志组名称,建议您根据业务自定义日志组的名称,创建成功后支持修改日志组名称。命名规范如下:

    • 日志组名称只支持输入英文、数字、中文、中划线、下划线及小数点,且不能以小数点、下划线开头或以小数点结尾。长度为1~64个字符。
    • 日志组名称不能重复。

    企业项目

    企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。

    默认选择default,建议根据业务选择企业项目,也可单击“查看企业项目”,在企业项目管理页面查看全部企业项目。

    日志存储时间(天)

    日志组的存储时间,即日志上报到LTS后日志存储的时间。

    日志数据默认存储30天,可以在1~365天之间设置。

    云日志服务LTS根据配置的日志存储时间定时清理日志内容,例如日志存储时间为30天,上报到LTS的日志只保存30天,30天后开始删除日志内容。

    说明:

    目前白名单用户的日志存储时间支持1095天,如有需要,请提工单申请。详细操作请参考提交工单

    • 日志数据默认存储7天,可以在1~7天之间设置。超出存储时间的日志将会被自动删除,您可以按需将日志数据转储至OBS桶中长期存储。
    • 上报到云日志服务的原始日志在达到日志存储时间后的次日凌晨就会被删除。

    标签

    按照业务需求对不同的日志组添加对应的标签。单击“添加”,分别填写标签键key和标签值value,开启应用到日志流后,日志组下的所有日志流即可自动加上该标签。如需添加多个标签可重复该步骤,最多支持添加20个标签。

    标签键key限制条件:

    • 标签键可以包含任意语种的字母、数字和空格,以及_.:=+-@字符,但首尾不能包含空格,且不能以_sys_开头。
    • 标签键长度不能超过128个字符。
    • 标签键名称不可重复。

    标签值value限制条件:

    • 标签值可以包含任意语种的字母、数字和空格,以及_.:=+-@字符。
    • 标签值长度不能超过255个字符。

    标签策略:

    若您的组织已经设定云日志服务的相关标签策略,则需按照标签策略规则为日志组、日志流、日志接入、主机组、告警规则添加标签。标签如果不符合标签策略的规则,则可能会导致日志组、日志流、日志接入、主机组、告警规则创建失败,请联系组织管理员了解标签策略详情。标签策略详细介绍请参考标签策略概述,标签管理详细介绍请参考标签管理

    删除标签:

    如需删除标签,请单击标签操作列的“删除”。

    警告:

    删除标签无法恢复,请谨慎操作。

    如果配置转储时使用了该标签,删除标签后,请同步修改转储配置信息。

    备注

    自定义填写备注信息,字符长度0-1024个字符。

  5. 单击“确定”,日志组创建成功,即可在日志组列表下方生成一条日志组信息。

    图1 日志组
    • 在日志组列表中,可以查看日志组名称、标签、日志流数量等信息。
    • 单击日志组名称,可跳转到日志详情页面。

步骤二 创建日志流

  1. 在云日志服务管理控制台,单击日志组名称对应的按钮。
  2. 单击展开页面左上角的“创建日志流”,输入日志流名称,名称需要满足如下要求:
    • 只支持输入英文、数字、中文、中划线、下划线及小数点,且不能以小数点、下划线开头或以小数点结尾。
    • 长度为1-64个字符。

    日志采集后,以日志流为单位,将多条日志数据发往云日志服务。如果日志较多,需要分门别类,建议您创建多个日志流,并给日志流做好命名,方便后续快速查找日志。

  3. 在“企业项目”处选择业务需要的企业项目,也可单击“查看企业项目”,在企业项目管理页面查看全部企业项目。
  4. 开启日志存储时间,使用日志流的日志存储时间,关闭日志存储时间,使用日志组的日志存储时间。
  5. 匿名写入默认关闭,适用于安卓/IOS/小程序/浏览器端上报日志,打开匿名写入则表示该日志流打开匿名写入权限,不会经过有效鉴权,可能产生脏数据。
  6. 自定义设置标签值,按照“标签键=标签值”的形式填写,例如a=b。
  7. 填写“备注”,字符长度0-1024个字符。
  8. 单击“确定”,完成日志流的创建。在日志流列表中,可以查看日志流名称、操作等信息。
    • 支持查看日志流计费状态,日志计费请参考价格计算器
    • 按日志流维度上报话单功能目前在友好用户内测中,您可以提交工单申请开通。

步骤三 获取日志组ID和日志流ID

  1. 在云日志服务管理控制台“日志管理”页面。
  2. 选择步骤一 创建日志组所创建的日志组,在操作列选择“更多>详情”。
  3. 获取并复制日志组ID。
  4. 单击日志组名称对应的按钮。
  5. 选择步骤二 创建日志流所创建的日志流,在操作列选择“详情”。
  6. 获取并复制日志流ID。

步骤四 CCI创建Deployment

  1. 登录云容器实例 CCI2.0控制台。
  1. 在左侧导航栏单击“负载管理”,选择“无状态负载”页签。
  2. 单击“YAML创建”,使用YAMLJSON创建无状态负载。
    • 方法一 使用YAML创建无状态负载示例:
    apiVersion: cci/v2
    kind: Deployment
    metadata:
      annotations:
        description: ''
      labels: {}
      name: test
      namespace: default  # 命名空间
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          annotations:
            logconf.k8s.io/fluent-bit-log-type: lts      # 必填项,使用TLS平台采集日志
            logconfigs.logging.openvessel.io: |
              {
                "default-config": {#支持设置多个容器的日志收集路径(stdout.log表示标准输出,/root/out.log表示rootfs(包含挂卷)下文本日志,/data/emptydir-xxx/*.log表示rootfs(包含挂卷)下文本目录
                  "container_files": {   
                    "container-0": "stdout.log;/root/out.log;/data/emptydir-volume/*.log",
                    "container-1": "/root/standard.log"
                  },
                  "regulation": "", #多行日志收集正则匹配规则,请参考正则匹配规则
                  "lts-log-info": {    #仅支持设置单个日志组和日志流
                    "<日志组ID>": "<日志流ID>"   #将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
                  }
                },
                "multi-config": {
                  "container_files": {
                    "container-0": "/root/multi.log",
                    "container-1": "stdout.log;/root/out.log;/data/emptydir-memory-volume/*.log"
                  },
                  "regulation": "/(?<log>\\d+-\\d+-\\d+ \\d+:\\d+:\\d+.*)/",
                  "lts-log-info": {    #仅支持设置单个日志组和日志流
                    "<日志组ID>": "<日志流ID>"   #将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
                  }
                }
              }
            resource.cci.io/pod-size-specs: 2.00_8.0
          labels:
            app: test
            sys_enterprise_project_id: "0"
        spec:
          containers:
          - image: swr.***.com/paas_cci/vk-webhook:8.16.0
            imagePullPolicy: IfNotPresent
            command: ['sh', '-c', "while true; do echo hello; touch /root/out.log; echo hello >> /root/out.log; touch /data/emptydir-volume/emptydir.log; echo hello >> /data/emptydir-volume/emptydir.log; sleep 10; done"]
            lifecycle: {}
            volumeMounts:
            - name: emptydir-volume
              mountPath: /data/emptydir-volume
            - name: emptydir-memory-volume
              mountPath: /data/emptydir-memory-volume
            name: container-0
            resources:
              limits:
                cpu: 100m
                memory: 100Mi
              requests:
                cpu: 100m
                memory: 100Mi
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          - image: swr.***.com/paas_cci/vk-webhook:8.16.0
            imagePullPolicy: IfNotPresent
            command: ['sh', '-c', "while true; do echo hello; touch /root/out.log; echo hello >> /root/out.log; touch /data/emptydir-memory-volume/emptydir-memory.log; echo $(date +'%Y-%m-%d %H:%M:%S.%3N') hello >> /data/emptydir-memory-volume/emptydir-memory.log; echo hello >> /data/emptydir-memory-volume/emptydir-memory.log; sleep 10; done"]
            lifecycle: {}
            volumeMounts:
            - name: emptydir-volume
              mountPath: /data/emptydir-volume
            - name: emptydir-memory-volume
              mountPath: /data/emptydir-memory-volume
            name: container-1
            resources:
              limits:
                cpu: 100m
                memory: 100Mi
              requests:
                cpu: 100m
                memory: 100Mi
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: Default
          volumes:
          - name: emptydir-volume
            emptyDir: {}
          - name: emptydir-memory-volume
            emptyDir:
              sizeLimit: 1Gi
              medium: Memory
          enableServiceLinks: false
          restartPolicy: Always
          schedulerName: volcano
          securityContext: {}
          terminationGracePeriodSeconds: 30
      minReadySeconds: 0
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 0
          maxUnavailable: 1
    表2 关键参数说明

    关键参数

    是否必选

    参数类型

    描述

    logconf.k8s.io/fluent-bit-log-type

    String

    • 参数解释:日志采集方式
    • 约束限制:必填项
    • 取值范围:lts

    logconfigs.logging.openvessel.io

    String

    • 参数解释:配置日志采集信息

    使用YAML示例时,“logconfigs.logging.openvessel.io”字段的相关参数注释需删除后再使用。

    • 方法二 使用JSON创建无状态负载示例:
    {
        "default-config": {
            "container_files": { // 支持设置多个容器的日志收集路径(stdout.log表示标准输出,/root/out.log表示rootfs(包含挂卷)下文本日志,/data/emptydir-xxx/*.log表示rootfs(包含挂卷)下文本目录)
                "container-0": "stdout.log;/root/out.log;/data/emptydir-volume/*.log",
                "container-1": "stdout.log"
            },
            "regulation": "", // 多行日志收集正则匹配规则正则匹配规则参考https://docs.fluentbit.io/manual/pipeline/parsers/configuring-parser
            "lts-log-info": { // 仅支持设置单个日志组和日志流
               "日志组ID": "日志流ID"  // 将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
            }
        },
        "multi-config": {
            "container_files": { // 支持设置多个容器的日志收集路径(stdout.log表示标准输出,/root/out.log表示rootfs(包含挂卷)下文本日志,/data/emptydir-xxx/*.log表示rootfs(包含挂卷)下文本目录)
                "container-0": "stdout.log;/root/out.log;/data/emptydir-memory-volume/*.log"
            },
            "regulation": "/(?<log>\\d+-\\d+-\\d+ \\d+:\\d+:\\d+.*)/",  // 多行日志收集正则匹配规则
            "lts-log-info": { // 仅支持设置单个日志组和日志流
               "日志组ID": "日志流ID"  // 将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
            }
        }
    }

    在YAML和JSON创建过程中需要将“lts-log-info”参数中添加步骤三 获取日志组ID和日志流ID示例:\"lts-log-info\":{\"日志组ID\":\"日志流ID\"}

  1. 完成后单击“确定”。
  2. 单击创建的无状态负载,可查看负载状态。

步骤五 查看日志组、日志流上报情况

  1. 在云日志服务管理控制台,单击日志组名称。
  2. 进入日志详情页面查看日志。