# 日志采集
CCI 2.0利用LTS日志服务采集应用日志并上报LTS，可以协助您排查和诊断问题。
#### 日志采集可靠性说明
日志系统的核心功能在于记录业务组件的全生命周期状态数据（包括启动初始化、退出、运行时信息及异常事件等），主要服务于组件运行状态查看与故障根因分析等运维场景。
请注意标准输出流（stdout/stderr）及本地日志文件采用非持久化存储机制，其数据完整性受制于以下风险因素：
- 日志轮转压缩机制可能触发历史文件清除。
- Kubernetes Pod实例终止导致的临时存储卷回收。
- 节点存储空间限制触发的操作系统自动清理。
尽管云原生日志采集插件通过多级缓冲、优先级队列、断点续传等机制优化采集可靠性，但在以下场景仍存在日志采集丢失的可能：
- 业务日志吞吐量超过采集端处理能力。
- 业务Pod终止并立即被容器运行时回收。
- 日志采集器Pod运行异常。
以下是基于云原生日志管理的最佳实践建议，请您认真考虑并采纳：
- 请通过专用高可靠性通道记录并持久化关键业务数据（如金融交易）。
- 请勿在日志中进行记录客户信息、支付凭证、会话令牌等敏感数据。
 
#### 约束与限制
- CCI 2.0当前仅支持在西南-贵阳一、华东-上海一、华北-北京四局点使用日志管理。

- 不支持容器中软链路径的日志采集。不支持指定系统、设备、cgroup、tmpfs等挂载目录的日志采集。
- 对于单行过长的日志（当前配置为250KB）会直接跳过采集。
- 只支持完整路径和文件名正则匹配，不支持路径正则匹配。
- 容器中文件名长度超过190字节的日志文件将无法被采集。文件名长度在180\~190字节范围的日志文件，仅支持采集第一个文件。
- Pod启动后不支持配置更新，即配置更新后关联的Pod需重启后配置才能生效。
- 单个Pod所有日志采集策略监听的文件数不超过2000个文件。
- 单个Pod单行日志采集速率不超过20000条/秒，多行日志不超过2000条/秒，日志大小不超过10MiB/秒。超过限制尽可能提供服务，不保证服务质量。
- 为了更好的采集日志，建议为Pod预留充足CPU和内存。Pod开启日志采集时请预留至少200MiB内存。另外每增加一个关联日志采集策略，建议多预留10MiB内存。Pod中日志打印总速率每1000行/s建议多预留0.03核CPU。
- 当容器被停止时，如果出现因网络延迟、资源占用多等原因导致的采集延时，可能会丢失容器停止前的部分日志。
- 当前暂不支持initcontainer日志采集。
- 鲲鹏实例暂不支持日志采集。
- 如果您的Pod使用外部公网镜像（如示例中的centos），**必须**确保当前命名空间（Namespace）配置了NAT网关或绑定了EIP，否则将无法拉取镜像。
 
 #### 步骤一 创建日志组
1. 登录[云日志服务控制台](https://console.huaweicloud.com/lts/)。
2. 进入"日志管理"页面，单击"创建日志组"。
3. 在"创建日志组"页面中，参考[表1]填写日志组相关信息。
   
    表1日志组参数说明 
   | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 日志组名称     | 日志组是云日志服务进行日志管理的基本单位，用于对日志流进行分类。如果日志较多，需要分门别类，建议您为日志组做好命名，方便后续快速查找日志。 LTS会自动生成一个默认的日志组名称，建议您根据业务自定义日志组的名称，创建成功后支持修改日志组名称。命名规范如下： - 日志组名称只支持输入英文、数字、中文、中划线、下划线及小数点，且不能以小数点、下划线开头或以小数点结尾。长度为1\~64个字符。  - 日志组名称不能重复。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 企业项目     | 企业项目是一种云资源管理方式，企业项目管理服务提供统一的云资源按项目管理，以及项目内的资源管理、成员管理。 默认选择default，建议根据业务选择企业项目，也可单击"查看企业项目"，在企业项目管理页面查看全部企业项目。 - 企业项目需要开通后才能使用，请参考[开通并进入企业管理页面](https://support.huaweicloud.com/usermanual-em/eps_15_0001.html)。  - 支持将该企业项目资源迁出，详细请参考[迁出企业项目资源](https://support.huaweicloud.com/usermanual-em/zh-cn_topic_0108763973.html)**。**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 日志存储时间(天) | 日志组的存储时间，即日志上报到LTS后日志存储的时间。 日志数据默认存储30天，可以在1\~365天之间设置。 云日志服务LTS根据配置的日志存储时间定时清理日志内容，例如日志存储时间为30天，上报到LTS的日志只保存30天，30天后开始删除日志内容。 说明： 目前白名单用户的日志存储时间支持1095天，如有需要，请提工单申请。详细操作请参考[提交工单](https://support.huaweicloud.com/usermanual-ticket/zh-cn_topic_0127038618.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 标签       | 按照业务需求对不同的日志组添加对应的标签。单击"添加"，分别填写标签键key和标签值value，开启应用到日志流后，日志组下的所有日志流即可自动加上该标签。如需添加多个标签可重复该步骤，最多支持添加20个标签。 **标签键key限制条件：** - 标签键可以包含任意语种的字母、数字和空格，以及_.:=+-@字符，但首尾不能包含空格，且不能以_sys_开头。  - 标签键长度不能超过128个字符。  - 标签键名称不可重复。   **标签值value限制条件：** - 标签值可以包含任意语种的字母、数字和空格，以及_.:=+-@字符。  - 标签值长度不能超过255个字符。   **标签策略：** 若您的组织已经设定云日志服务的相关标签策略，则需按照标签策略规则为日志组、日志流、日志接入、主机组、告警规则添加标签。标签如果不符合标签策略的规则，则可能会导致日志组、日志流、日志接入、主机组、告警规则创建失败，请联系组织管理员了解标签策略详情。标签策略详细介绍请参考[标签策略概述](https://support.huaweicloud.com/usermanual-organizations/org_03_0067.html)，标签管理详细介绍请参考[标签管理](https://support.huaweicloud.com/usermanual-organizations/org_03_0044.html)。 **删除标签：** 如需删除标签，请单击标签操作列的"删除"。 警告： 删除标签无法恢复，请谨慎操作。 如果配置转储时使用了该标签，删除标签后，请同步修改转储配置信息。 |
   | 备注        | 自定义填写备注信息，字符长度0-1024个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
      
   
   
4. 单击"确定"，日志组创建成功，即可在日志组列表下方生成一条日志组信息。 
   图1日志组   
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002410661122.png "点击放大")
   - 在日志组列表中，可以查看日志组名称、标签、日志流数量等信息。
   
   - 单击日志组名称，可跳转到日志详情页面。
   
   
   
   
 
 #### 步骤二 创建日志流
1. 在[LTS控制台](https://console.huaweicloud.com/lts/#/cts/manager/groups)，单击日志组名称对应的![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000001911901677.png)按钮。
2. 单击展开页面左上角的"创建日志流"，输入日志流名称，名称需要满足如下要求：
   - 只支持输入英文、数字、中文、中划线、下划线及小数点，且不能以小数点、下划线开头或以小数点结尾。
   
   - 长度为1-64个字符。
   
   
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
   日志采集后，以日志流为单位，将多条日志数据发往云日志服务。如果日志较多，需要分门别类，建议您创建多个日志流，并给日志流做好命名，方便后续快速查找日志。
   
3. 在"企业项目"处选择业务需要的企业项目，也可单击"查看企业项目"，在企业项目管理页面查看全部企业项目。
4. 开启日志存储时间，使用日志流的日志存储时间，关闭日志存储时间，使用日志组的日志存储时间。
5. 开启日志存储时间后，根据需要是否开启智能冷存储。
6. 匿名写入默认关闭，适用于安卓/IOS/小程序/浏览器端上报日志，打开匿名写入则表示该日志流打开匿名写入权限，不会经过有效鉴权，可能产生脏数据。
7. 自定义设置标签值，按照"标签键=标签值"的形式填写，例如a=b。
8. 填写"备注"，字符长度0-1024个字符。
9. 单击"确定"，完成日志流的创建。在日志流列表中，可以查看日志流名称、操作等信息。
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
   - 支持查看日志流计费状态，日志计费请参考[价格计算器](https://www.huaweicloud.com/pricing.html#/lts)。
   
   - 按日志流维度上报话单功能目前在友好用户内测中，您可以[提交工单](https://support.huaweicloud.com/usermanual-ticket/zh-cn_topic_0127038618.html)申请开通。
    
   
   
 
 #### 步骤三 获取日志组ID和日志流ID
1. 在[LTS控制台](https://console.huaweicloud.com/lts/#/cts/manager/groups)"日志管理"页面。
2. 选择[步骤一 创建日志组]所创建的日志组，在操作列选择"更多\>详情"。
3. 获取并复制日志组ID。
4. 单击日志组名称对应的![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000001911851089.png)按钮。
5. 选择[步骤二 创建日志流]所创建的日志流，在操作列选择"详情"。
6. 获取并复制日志流ID。
 
#### 步骤四 CCI创建Deployment
1. 登录[云容器实例 CCI 2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。

1. 在左侧导航栏单击"负载管理"，选择"无状态负载"页签。
2. 单击"YAML创建"，使用[YAML]或[JSON]创建无状态负载。
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
   使用YAML示例时，"logconfigs.logging.openvessel.io"字段的相关参数注释需删除后再使用。
   - 方法一 使用YAML创建无状态负载示例：
     **YAML基础版本** （可直接使用）：
     ```
     apiVersion: cci/v2
     kind: Deployment
     metadata:
       name: log-simplified-demo
       namespace: default  # 命名空间
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: log-simplified-demo
       template:
         metadata:
           labels:
             app: log-simplified-demo
           annotations:   
             logconf.k8s.io/fluent-bit-log-type: lts      # 必填项，使用LTS平台采集日志
             logconfigs.logging.openvessel.io: |
               {
                   "log-setting-01": {
                       "container_files": {
                           "container-0": "stdout.log;/root/out.log;/tmp/*/*.log"  #stdout.log表示采集标准输出，/root/out.log表示采集/root路径下的out.log日志文件，/tmp/*/*.log表示采集/tmp路径中任意名称文件夹中所有后缀为.log的日志文件
                       },
                       "lts-log-info": {
                           "<日志组ID>": "<日志流ID>" #将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
                       }
                   }
               }
         spec:
           containers:
             - name: container-0
               image: nginx:alpine
               imagePullPolicy: IfNotPresent
               resources:
                 requests:
                   cpu: 500m
                   memory: 1024Mi
                 limits:
                   cpu: 500m
                   memory: 1024Mi
               # 模拟日志输出
               command: ["/bin/sh", "-c"]
               args:
                 - while true; do echo "$(date) - [INFO] - Keeping it simple."; sleep 2; done
     ```
     **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      # 必填项，使用LTS平台采集日志
             logconfigs.logging.openvessel.io: |
               {
                 "default-config": { #支持设置多个容器的日志收集路径（stdout.log表示采集标准输出，/root/out.log表示采集/root路径下的out.log日志文件，/data/emptydir-volume/*.log表示采集/data/emptydir-volume路径下所有后缀为.log的日志文件）
                   "container_files": {   
                     "container-0": "stdout.log;/root/out.log;/data/emptydir-volume/*.log",
                     "container-1": "/root/standard.log"
                   },
                   "regulation": "", #多行日志收集正则匹配规则，请参考正则匹配规则
                   "lts-log-info": {    #在单个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": {    #在单个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  | - 参数解释：配置日志采集信息  - 约束限制：如果配置多个日志采集信息，在日志界面仅展示第一个（按照字典序）所配置的日志采集信息。                         |
        
     
   
   
   
   - 方法二 使用JSON创建无状态负载示例：
     **JSON示例基础版**（可直接使用）
     **JSON进阶版**（需配置正则匹配等内容）
     ```
     {
         "default-config": {
             "container_files": { // 支持设置多个容器的日志收集路径（stdout.log表示采集标准输出，/root/out.log表示采集/root路径下的out.log日志文件，/data/emptydir-volume/*.log表示采集/data/emptydir-volume路径下所有后缀为.log的日志文件）
                 "container-0": "stdout.log;/root/out.log;/data/emptydir-volume/*.log",
                 "container-1": "stdout.log"
             },
             "regulation": "", // 多行日志收集正则匹配规则，请参考正则匹配规则
             "lts-log-info": { // 在单个lts-log-info中仅支持设置单个日志组和日志流
                "日志组ID": "日志流ID"  // 将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
             }
         },
         "multi-config": {
             "container_files": { // 支持设置多个容器的日志收集路径（stdout.log表示采集标准输出，/root/out.log表示采集/root路径下的out.log日志文件，/data/emptydir-volume/*.log表示采集/data/emptydir-volume路径下所有后缀为.log的日志文件）
                 "container-0": "stdout.log;/root/out.log;/data/emptydir-memory-volume/*.log"
             },
             "regulation": "/(?<log>\\d+-\\d+-\\d+ \\d+:\\d+:\\d+.*)/",  // 多行日志收集正则匹配规则，请参考正则匹配规则
             "lts-log-info": { // 在单个lts-log-info中仅支持设置单个日志组和日志流
                "日志组ID": "日志流ID"  // 将日志组ID、日志流ID替换为在步骤三 获取日志组ID和日志流ID中获取的日志组ID和日志流ID
             }
         }
     }
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/caution_3.0-zh-cn.png)
   在YAML和JSON创建过程中需要将"lts-log-info"参数中添加[步骤三 获取日志组ID和日志流ID]。示例：\\"lts-log-info\\":{\\"日志组ID\\":\\"日志流ID\\"}
   - 将日志组ID替换为[步骤三 获取日志组ID和日志流ID]。
   
   - 将日志流ID替换为[步骤三 获取日志组ID和日志流ID]。
     

3. 完成后单击"确定"。
4. 单击创建的无状态负载，可查看负载状态。
 
#### 步骤五 查看日志组、日志流上报情况
1. 登录[云容器实例 CCI 2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"负载管理"，单击"无状态负载"。
3. 根据工作负载的名称选择其对应操作列下的日志，单击"日志"。 
   图2查看日志   
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002377391726.png "点击放大")
   
   
4. 进入详情页面即可查看日志相关内容。 
   图3日志详情   
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002411044845.png "点击放大")
   
   
 
