通过控制台采集集群容器日志(标准输出/文件)

在 Kubernetes 环境中,容器日志分散、难以集中管理,导致问题排查效率低、运维成本高。通过以DaemonSet模式部署LoongCollector采集器,并在日志服务控制台创建采集配置,即可实现日志的统一收集与结构化处理,提升日志检索、问题定位及可观测性分析的效率。

适用范围

  • 运行环境:

    • 支持阿里云容器服务ACK(托管与专有版)和自建Kubernetes 集群。

    • Kubernetes1.10.0及以上版本且支持Mount propagation: HostToContainer

    • 容器运行时(仅支持DockerContainerd)

      • Docker:

        • 需具备访问docker.sock的权限。

        • 标准输出采集仅支持JSON类型的日志驱动。

        • 存储驱动仅支持overlay、overlay2两种存储驱动(其他类型需手动挂载日志目录)。

      • Containerd:需具备访问containerd.sock的权限。

  • 资源要求:LoongCollector(Logtail)以system-cluster-critical高优先级运行,集群资源不足时请勿部署,否则可能驱逐节点上原有的Pod。

    • CPU:至少预留0.1 Core

    • 内存:采集组件至少150MB,控制器组件至少100MB

    • 实际使用量与采集速率、监控目录和文件数量、发送阻塞程度有关,请保证实际使用率低于限制值的80%。

  • 权限要求:部署使用的阿里云主账号或子账号需具备AliyunLogFullAccess权限。

    如需自定义权限策略,请参考AliyunCSManagedLogRolePolicy系统策略,将其包含的权限内容复制并赋予目标 RAM 用户或角色,以实现精细化的权限配置。

采集配置创建流程

  1. 安装LoongCollector通过DaemonSet模式部署LoongCollector,确保集群中每个节点均运行一个采集容器,统一采集该节点上所有容器的日志。

    Sidecar模式请参考采集集群文本日志(Sidecar)
  2. 创建LogstoreLogstore是日志数据的存储单元,用于存储日志。一个 Project 内可创建多个 Logstore。

  3. 创建采集配置:

    本文仅介绍常用的配置参数,涵盖典型使用场景下的核心选项。如需了解完整的配置参数列表及详细说明,请参考更多信息
    • 极简配置(必选):构建从集群到日志服务Project的数据通道。

    • 常用处理配置(可选):配置常用数据处理插件,对采集到的原始日志进行结构化解析(如正则解析、分隔符解析)或脱敏、过滤处理等。

      本文仅介绍原生处理插件,覆盖常见日志处理场景,如需更多功能,请参考扩展处理插件
    • 其他高级配置(可选):实现多行文本日志的采集、日志标签富化等,满足更精细化的采集需求。

安装LoongCollector(Logtail)

LoongCollector 是阿里云日志服务(SLS)推出的新一代日志采集 Agent,是 Logtail 的升级版,二者不能同时存在,如需安装Logtail,请参考安装、运行、升级、卸载Logtail

本文仅介绍LoongCollector的基础安装步骤,如需了解详细参数请参考LoongCollector安装(Kubernetes)。如果您已安装LoongCollectorLogtail,可跳过此步骤,直接创建存储采集日志的Logstore

ACK集群

通过容器服务控制台安装LoongCollector,默认将日志发送到当前阿里云账号的日志服务Project中。

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

  2. 集群列表页面,单击目标集群名称,进入集群详情页。

  3. 在左侧导航栏,单击组件管理

  4. 日志与监控页签中,找到loongcollector,单击安装

    说明

    对于新建集群,在组件配置页面,勾选使用日志服务,支持创建新Project使用已有Project

    安装完成后,日志服务会自动在ACK所属地域下创建相关资源,您可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    k8s-log-${cluster_id}

    资源管理单元,隔离不同业务日志。

    如需自行创建Project以实现更灵活的日志资源管理,请参考创建Project

    机器组

    k8s-group-${cluster_id}

    日志采集节点集合。

    Logstore

    config-operation-log

    重要

    请不要删除该Logstore。

    用于存储loongcollector-operator组件的日志,其计费方式与普通Logstore相同,详见按写入数据量计费模式计费项建议不要在此Logstore下创建采集配置。

自建集群

  1. 连接Kubernetes集群,根据地域选择对应命令,下载LoongCollector及其依赖组件:

    中国地域:

    wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh

    海外地域:

    wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
  2. 进入loongcollector-custom-k8s-package目录,修改配置文件./loongcollector/values.yaml

    # ===================== 必需要补充的内容 =====================
    # 本集群要采集的Project名,例如 k8s-log-custom-sd89ehdq
    projectName: ""
    # Project所属地域,例如上海:cn-shanghai
    region: ""
    # Project所属主账号uid,请用引号包围,例如"123456789"
    aliUid: ""
    # 使用网络,可选参数:公网Internet,内网Intranet,默认使用公网
    net: Internet
    # 主账号或者子账号的AK,SK,需具备AliyunLogFullAccess系统策略权限
    accessKeyID: ""
    accessKeySecret: ""
    # 自定义集群ID,命名只支持大小写,数字,短划线(-)。
    clusterID: ""
  3. loongcollector-custom-k8s-package目录,执行如下命令,安装LoongCollector及其他依赖组件:

    bash k8s-custom-install.sh install
  4. 安装完成后,查看组件运行状态。

    Pod未成功启动,请确认values.yaml配置是否正确,相关镜像拉取是否成功。
    # 检查Pod状态
    kubectl get po -n kube-system | grep loongcollector-ds

    同时,日志服务会自动创建如下资源,可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    values.yaml文件中自定义的projectName的值

    资源管理单元,隔离不同业务日志。

    如需自行创建Project以实现更灵活的日志资源管理,请参考创建Project

    机器组

    k8s-group-${cluster_id}

    日志采集节点集合。

    Logstore

    config-operation-log

    重要

    请不要删除该Logstore。

    用于存储loongcollector-operator组件的日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项。建议不要在此Logstore下创建采集配置。

创建Logstore

若您已提前创建好Logstore,可直接跳过此步骤,进行采集配置

SLS 支持按写入数据量和按使用功能两种计费模式,您可在创建Logstore时根据实际使用场景选择合适的计费模式。
  1. 登录日志服务控制台,单击目标Project名称。

  2. 在左侧导航栏,选择image日志存储,单击+

  3. 在创建Logstore页面,完成以下核心配置:

    • Logstore名称:设置一个在Project内唯一的名称。该名称创建后不可修改。

    • Logstore类型:根据规格对比选择标准型或查询型。

    • 计费模式

      • 按使用功能计费:按存储、索引、读写次数等各项资源独立计费。适合小规模或功能使用不确定的场景。

      • 按写入数据量计费:仅按原始写入数据量计费,并提供30天的免费存储周期及免费的数据加工、投递等功能。成本模型简单,适合存储周期接近30天或数据处理链路复杂的场景。

    • 数据保存时间:设置日志的保留天数,取值范围为1~3650天(3650天表示永久保存)。默认为30天。

  4. 其他配置保持默认,单击确定。如需了解其他配置信息,请参考管理Logstore

极简配置

在完成 LoongCollector 安装创建Logstore后,即可开始创建采集配置。本节介绍两种极简采集场景——容器标准输出和集群文本日志,仅将原始日志上传至 Logstore,不涉及任何解析或处理,适用于快速建立数据通道。

在日志库(Logstore)image页面:

  1. 单击目标Logstore名称前的image

  2. 单击数据接入后的image

  3. 根据日志源选择快速接入模板。容器内日志包含两种日志来源:

    • 标准输出(stdoutstderr):容器程序打印到控制台的日志内容。

    • 文本日志文件:容器内部写入指定路径下的日志文件。

image

采集容器标准输出(Stdout)

  1. 快速数据接入弹框中,搜索模板:K8s-标准输出-新版,单击立即接入

  2. 机器组配置,完成后单击下一步

    • 使用场景K8s场景

    • 部署方式ACK Daemonset自建集群Daemonset

    • 源机器组中将系统默认创建的机器组k8s-group-${cluster_id}添加至右侧应用机器组

  3. Logtail配置,完成后单击下一步

    • 全局配置:填写配置名称。

    • 输入配置:选择开启标准输出标准错误开关(默认全部开启)。

    • 处理配置

      • (可选)常用处理配置:对原始日志进行结构化解析(如正则解析、分隔符解析)或脱敏、过滤处理等。

      • (可选)其他高级配置:实现多行文本日志的采集、日志标签富化等,满足更精细化的采集需求。

  4. 查询分析配置:预览数据,单击自动生成索引,日志服务将生成字段索引,完成后单击下一步结束配置。

原始日志:

10.244.0.1 - - [01/Aug/2025:10:25:30 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.88.1"

采集原始标准输出(Stdout):

10.244.0.1 - - [01/Aug/2025:10:25:30 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.88.1"

采集集群文本日志

  1. 快速数据接入弹框中,搜索模板:Kubernetes-文件,单击立即接入

  2. 机器组配置,完成后单击下一步

    • 使用场景K8s场景

    • 部署方式ACK Daemonset自建集群Daemonset

    • 源机器组中将系统默认创建的机器组k8s-group-${cluster_id}添加至右侧应用机器组

  3. Logtail配置,完成后单击下一步

    • 全局配置:填写配置名称。

    • 输入配置

      • Logtail部署模式Daemonset

      • 文件路径类型

        • 容器内路径:采集容器内的日志文件。

        • 宿主机路径:采集宿主机本地服务日志。

      • 文件路径:日志采集的绝对路径,Linux下以“/”开头。

        示例:/data/mylogs/**/*.log,表示/data/mylogs目录下所有后缀名为.log的文件。

      • 最大目录监控深度文件路径中通配符**匹配的最大目录深度。默认为0(仅本层),取值范围是0~1000。

        建议设置深度为0,配置路径到文件所在的目录。
    • 处理配置

      • (可选)常用处理配置:对原始日志进行结构化解析(如正则解析、分隔符解析)或脱敏、过滤处理等。

      • (可选)其他高级配置:实现多行文本日志的采集、日志标签富化等,满足更精细化的采集需求。

  4. 查询分析配置:预览数据,单击自动生成索引,日志服务将生成字段索引,完成后单击下一步结束配置。

原始日志:

Aug 19 11:20:51 hostname-1 crond[2995]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

原始日志整行存储至content:

content: Aug 19 11:20:51 hostname-1 crond[2995]: (CRON) INFO (@reboot jobs will be run at computer's startup.)

常用处理配置

在完成极简配置后,您可以通过添加处理插件,对原始日志进行结构化解析或脱敏、过滤处理。

此处仅介绍原生处理插件,覆盖常见日志处理场景,如需更多功能,请参考扩展处理插件
重要

对于Logtail 2.0及以上版本以及LoongCollector组件,推荐遵循以下插件组合规则:

  • 优先使用原生插件。

  • 当原生插件无法满足需求时,可在原生插件后配置扩展插件。

  • 原生插件只能在扩展插件之前使用。

您可以在新建/更新采集配置时添加处理插件

  • 更新采集配置:

    1. 在左侧导航栏,选择image日志库,找到目标Logstore。

    2. 单击其名称前的image展开Logstore。

    3. 单击Logtail配置,在配置列表中,找到目标Logtail配置,单击操作列的管理Logtail配置

    4. Logtail配置页面,单击编辑,下滑至处理配置区域,配置解析插件。

  • 新建采集配置:处理配置区域,配置解析插件。

结构化配置

正则解析

通过正则表达式提取日志字段,并将日志解析为键值对形式。

  1. 添加日志样例:使用实际场景中待采集日志的样例。配置日志样例可协助配置日志处理相关参数,降低配置难度。

  2. 单击添加处理插件,选择原生处理插件 > 正则解析

    • 正则表达式:用于匹配日志,支持自动生成或手动输入:

      • 自动生成:

        • 单击自动生成正则表达式

        • 日志样例中划选需要提取的日志内容。

        • 单击生成正则

          image

      • 手动输入:根据日志格式手动输入正则表达式

      配置完成后,单击验证,测试正则表达式是否能够正确解析日志内容。

    • 日志提取字段:为提取的日志内容(Value),设置对应的字段名(Key)。

原始日志:

127.0.0.1 - - [16/Aug/2024:14:37:52 +0800] "GET /wp-admin/admin-ajax.php?action=rest-nonce HTTP/1.1" 200 41 "http://www.example.com/wp-admin/post-new.php?post_type=page" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"

自定义正则解析:正则表达式(\S+)\s-\s(\S+)\s\[([^]]+)]\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+).*

body_bytes_sent: 41
http_referer: http://www.example.com/wp-admin/post-new.php?post_type=page
http_user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; ×64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
remote_addr: 127.0.0.1
remote_user: -
request_method: GET
request_protocol: HTTP/1.1
request_uri: /wp-admin/admin-ajax.php?action=rest-nonce
status: 200
time_local: 16/Aug/2024:14:37:52 +0800

分隔符解析

通过分隔符将日志内容结构化,解析为多个键值对形式,支持单字符分隔符和多字符分隔符。

单击添加处理插件,选择原生处理分隔符解析

  • 分隔符:指定用于切分日志内容的字符。

    示例:对于CSV格式文件,选择自定义,输入半角逗号(,)。

  • 引用符:当某个字段值中包含分隔符时,需要指定引用符包裹该字段,避免错误切割。

  • 日志提取字段:按分隔顺序依次为每一列设置对应的字段名称(Key)。规则要求如下:

    • 字段名只能包含:字母、数字、下划线(_)。

    • 必须以字母或下划线(_)开头。

    • 最大长度:128字节。

原始日志:

05/May/2025:13:30:28,10.10.*.*,"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1",200,18204,aliyun-sdk-java

按指定字符,切割字段:

ip:10.10.*.*
request:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1
size:18204
status:200
time:05/May/2025:13:30:28
user_agent:aliyun-sdk-java

标准JSON解析

Object类型的JSON日志结构化,解析为键值对形式。

单击添加处理插件,选择原生处理插件 > JSON解析

  • 原始字段:默认值为content(此字段用于存放待解析的原始日志内容)。

  • 其余配置保持默认。

原始日志:

{"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/2025:13:30:28"}

标准JSON键值自动提取:

ip: 10.200.98.220
request: {"status": "200", "latency" : "18204" }
time: 05/Jan/2025:13:30:28
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
user-agent:aliyun-sdk-java

嵌套JSON解析

通过指定展开深度,将嵌套的JSON日志解析为键值对形式。

单击添加处理插件,选择拓展处理插件 > 展开JSON字段

  • 原始字段:需要展开的原始字段名,例如content

  • JSON展开深度:JSON对象的展开层级。0表示完全展开(默认值),1表示当前层级,以此类推。

  • JSON展开连接符:JSON展开时字段名的连接符,默认为下划线 _。

  • JSON展开字段前缀:指定JSON展开后字段名的前缀。

  • 展开数组:开启此项可将数组展开为带索引的键值对。

    示例:{"k":["a","b"]} 展开为  {"k[0]":"a","k[1]":"b"}

    如果需要对展开后的字段进行重命名(例如,将 prefix_s_key_k1 改为 new_field_name),可以后续再添加一个重命名字段插件来完成映射。

原始日志:

{"s_key":{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}}

展开深度:0,并使用展开深度作为前缀。

0_s_key_k1_k2_k3_k41:41
0_s_key_k1_k2_k3_k4_k51:51
0_s_key_k1_k2_k3_k4_k52:52

展开深度:1,并使用展开深度作为前缀。

1_s_key:{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}

JSON数组解析

使用json_extract函数,从JSON数组中提取JSON对象。

处理模式切换为SPL

  • SPL语句:使用  json_extract函数从JSON数组中提取JSON对象。

    示例:从日志字段 content 中提取 JSON 数组中的元素,并将结果分别存储在新字段 json1和 json2 中。

    * | extend json1 = json_extract(content, '$[0]'), json2 = json_extract(content, '$[1]')

原始日志:

[{"key1":"value1"},{"key2":"value2"}]

提取JSON数组结构:

json1:{"key1":"value1"}
json2:{"key2":"value2"}

Nginx日志解析

根据log_format中的定义将日志内容结构化,解析为多个键值对形式。如默认内容不符合您的需求,可使用自定义格式。

单击添加处理插件,选择原生处理插件 > NGINX模式解析

  • NGINX日志配置:请将 Nginx 服务器配置文件(通常位于 /etc/nginx/nginx.conf)中的 log_format 定义完整地复制并粘贴到此文本框中。

    示例:

    log_format main  '$remote_addr - $remote_user [$time_local] "$request" ''$request_time $request_length ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';
    重要

    此处的格式定义必须与服务器上生成日志的格式完全一致,否则将导致日志解析失败。

原始日志:

192.168.*.* - - [15/Apr/2025:16:40:00 +0800] "GET /nginx-logo.png HTTP/1.1" 0.000 514 200 368 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.*.* Safari/537.36"

根据log_format main的定义解析为键值对:

body_bytes_sent: 368
http_referer: -
http_user_agent : Mozi11a/5.0 (Nindows NT 10.0; Win64; x64) AppleMebKit/537.36 (KHTML, like Gecko) Chrome/131.0.x.x Safari/537.36
remote_addr:192.168.*.*
remote_user: -
request_length: 514
request_method: GET
request_time: 0.000
request_uri: /nginx-logo.png
status: 200
time_local: 15/Apr/2025:16:40:00

Apache日志解析

根据Apache日志配置文件中的定义将日志内容结构化,解析为多个键值对形式。

单击添加处理插件,选择原生处理插件 > APACHE模式解析

  • 日志格式combined

  • APACHE配置字段:系统会根据日志格式自动填充配置。

    重要

    请务必核对自动填充的内容,确保与服务器上 Apache 配置文件(通常位于/etc/apache2/apache2.conf)中定义的 LogFormat 完全一致。

原始日志:

1 192.168.1.10 - - [08/May/2024:15:30:28 +0800] "GET /index.html HTTP/1.1" 200 1234 "https://www.example.com/referrer" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36"

Apache通用日志格式combined解析:

http_referer:https://www.example.com/referrer
http_user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36
remote_addr:192.168.1.10
remote_ident:-
remote_user:-
request_method:GET
request_protocol:HTTP/1.1
request_uri:/index.html
response_size_bytes:1234
status:200
time_local:[08/May/2024:15:30:28 +0800]

数据脱敏

对日志中的敏感数据进行脱敏处理。

处理配置区域,单击添加处理插件,选择原生处理插件 > 脱敏处理

  • 原始字段:解析日志前,用于存放日志内容的原始字段。

  • 脱敏方式

    • const:将敏感内容替换成所修改的字符串。

    • md5:将敏感内容替换为其对应的MD5值。

  • 替换字符串:选择脱敏方式const时,需要输入字符串,用于替换敏感内容。

  • 被替换内容前的内容表达式:用于查找敏感内容,使用RE2语法配置。

  • 被替换的内容表达式:敏感内容的表达式,使用RE2语法配置。

原始日志:

[{'account':'1812213231432969','password':'04a23f38'}, {'account':'1812213685634','password':'123a'}]

脱敏结果:

[{'account':'1812213231432969','password':'********'}, {'account':'1812213685634','password':'********'}]

内容过滤

基于正则表达式匹配日志字段值,仅采集符合白名单条件的日志。

处理配置区域,单击添加处理插件,选择原生处理插件 > 过滤处理

  • 字段名:过滤的日志字段。

  • 字段值:用于过滤的正则表达式,仅支持全文匹配,不支持关键词部分匹配。

原始日志:

{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
{"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}
{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}

过滤日志:设置字段名level字段值WARNING|ERROR,表示只采集level字段值为WARNINGERROR的日志。

{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
{"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}

时间解析

对日志中的时间字段进行解析,并将解析结果设置为日志的__time__字段。

处理配置区域,单击添加处理插件,选择原生处理插件 > 时间解析

  • 原始字段:解析日志前,用于存放日志内容的原始字段。

  • 时间格式:根据日志中的时间内容设置对应的时间格式

  • 时区:选择日志时间字段所在的时区。默认使用机器时区,即LoongCollector(Logtail)进程所在环境的时区。

原始日志:

{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}

时间解析:

image

其他高级配置

在完成极简配置常用处理配置后,您可以参考下述操作采集多行日志、配置日志主题类型等,以满足更精细化的日志采集需求。

无论是创建采集配置还是更新采集配置,都需要在Logtail配置页面完成。以下为如何修改已有配置的操作流程:

  1. 在左侧导航选择image日志库,找到目标Logstore。

  2. 单击其名称前的image展开Logstore。

  3. 单击Logtail配置,在配置列表中,找到目标Logtail配置,单击操作列的管理Logtail配置

  4. Logtail配置页面,单击编辑

功能

用途

多行日志采集

处理 Java 堆栈等跨行日志

容器过滤

按容器名、标签、环境变量筛选

黑名单过滤

忽略敏感或无关日志文件

日志标签富化

添加环境变量、容器信息作为元字段

传输压缩

启用 lz4/zstd减少带宽


多行日志采集

默认情况下,日志服务以单行模式工作,会将每一行文本都视为一条独立的日志。这会导致包含堆栈跟踪、JSON 等内容的多行日志被错误地拆分,从而丢失上下文。

针对上述问题,可以开启多行模式,定义一个行首正则表达式,让日志服务能够准确识别一条完整日志的起始行,从而将多行内容合并为一条日志。

处理配置

  • 开启多行模式

  • 类型:选择自定义多行JSON

    • 自定义:原始日志的格式不固定,需配置行首正则表达式,来标识每条日志的起始行。

      • 行首正则表达式:支持自动生成或手动输入,正则表达式需要能够匹配完整的一行数据,如上述示例中匹配的正则表达式为\[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*

        • 自动生成:单击自动生成正则表达式,然后在日志样例文本框中,划选需提取的日志内容,单击生成正则

        • 手动输入:单击手动输入正则表达式,输入完成后,单击验证

    • 多行JSON:当原始日志均为标准JSON格式时选择,日志服务会自动处理单条JSON日志内部的换行。

  • 切分失败处理方式

    • 丢弃:如果一段文本无法匹配行首规则,则直接丢弃。

    • 保留单行:将无法匹配的文本按原始的单行模式进行切分和保留。

原始日志:

[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)

单行模式:每行作为独立日志,堆栈信息被拆散,丢失上下文。

image

多行模式:通过行首正则识别完整日志,保留完整语义结构。

content:[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)

配置日志主题类型

全局配置 > 其他全局配置 > 日志主题类型:选择Topic生成方式。

  • 机器组Topic:日志服务支持将一个采集配置应用到多个机器组。LoongCollector上报数据时,会将服务器所在机器组的Topic作为日志主题上传至Logstore,您可以根据Topic区分来自不同机器组的日志。

  • 文件路径提取:若不同的用户或应用将日志写入不同的顶级目录,但下级路径和文件名相同,导致无法从文件名区分日志来源。此时您可以配置文件路径提取,通过正则表达式来匹配完整的文件路径,并将匹配结果(用户名或应用名)作为日志主题(Topic)上传至Logstore。

    说明

    文件路径的正则表达式中,需要对正斜线(/)进行转义。

    通过文件路径正则提取

    场景描述:不同用户将日志记录在不同目录下,但是日志文件名称相同,目录路径如下所示。

    /data/logs
    ├── userA
    │   └── serviceA
    │       └── service.log
    ├── userB
    │   └── serviceA
    │       └── service.log
    └── userC
        └── serviceA
            └── service.log

    如果在Logtail配置中仅配置文件路径为/data/logs且文件名称为service.log,LoongCollector(Logtail)会将三个service.log文件中的内容采集至同一个Logstore中,因此无法区分日志具体由哪个用户产生。此时您可以使用正则表达式提取文件路径中的值,生成不同的日志主题。

    正则表达式

    提取结果

    \/data\/logs\/(.*)\/serviceA\/.*
    __topic__: userA
    __topic__: userB
    __topic__: userC

    通过多捕获组提取

    场景描述:如果单个日志主题不足以区分日志的来源,可以在日志文件路径中配置多个正则捕获组来提取关键信息。其中捕获组包括命名捕获组(?P<name>)和非命名捕获组两类。

    • 命名捕获组:生成的tag字段为__tag__:{name}

    • 非命名捕获组:生成的tag字段为__tag__:__topic_{i}__,其中{i}为捕获组的序号。

    说明

    当正则表达式中存在多个捕获组时,不会生成__topic__字段。

    例如,文件路径为/data/logs/userA/serviceA/service.log,可通过以下方式提取文件路径中的多个值:

    示例

    正则表达式

    提取结果

    使用非命名捕获组进行正则提取。

    \/data\/logs\/(.*?)\/(.*?)\/service.log
    __tag__:__topic_1__: userA
    __tag__:__topic_2__: serviceA

    使用命名捕获组进行正则提取。

    \/data\/logs\/(?P<user>.*?)\/(?P<service>.*?)\/service.log
    __tag__:user: userA
    __tag__:service: serviceA

    验证:配置完成后,可以根据日志主题查询日志。

    在日志查询分析页面,输入对应生成的日志主题,例如__topic__: userA__tag__:__topic_1__: userA查询相应主题的日志。

    image

  • 自定义:输入customized:// + 自定义主题名,使用自定义的静态日志主题。


容器过滤与黑名单

容器过滤

输入配置

  • 开启容器过滤,单击添加,选择过滤方式并配置,多个条件之间为“且”的关系。

    • 环境变量黑/白名单:指定待采集容器的环境变量条件。

    • K8s Pod标签黑/白名单:指定待采集容器所在 pod 的标签条件。

    • K8s Pod 名称正则匹配:通过Pod名称指定待采集的容器

    • K8s Namespace 正则匹配:通过Namespace名称指定待采集的容器。

    • K8s 容器名称正则匹配:通过容器名称指定待采集的容器。

    • 容器label黑/白名单:采集容器标签符合条件的容器,docker场景使用,K8s场景不推荐使用。

黑名单

输入配置 > 其他输入配置:开启采集黑名单,单击添加,配置黑名单。

支持完整匹配和通配符匹配目录和文件名,通配符只支持星号(*)和半角问号(?)。
  • 文件路径黑名单:需要忽略的文件路径,示例:

    • /home/admin/private*.log:在采集时忽略/home/admin/目录下所有以private开头,以.log结尾的文件。

    • /home/admin/private*/*_inner.log:在采集时忽略/home/admin/目录下以private开头的目录内,以_inner.log结尾的文件。

  • 文件黑名单:配置采集时需要忽略的文件名,示例:

    • app_inner.log:在采集时忽略所有名为app_inner.log的文件。

  • 目录黑名单:目录路径不能以正斜线(/)结尾,示例:

    • /home/admin/dir1/:目录黑名单不会生效。

    • /home/admin/dir*:在采集时忽略/home/admin/目录下所有以dir开头的子目录下的文件。

    • /home/admin/*/dir:在采集时忽略/home/admin/目录下二级目录名为dir的子目录下的所有文件。例如/home/admin/a/dir目录下的文件被忽略,/home/admin/a/b/dir目录下的文件被采集。


日志标签富化

输入配置 > 日志标签富化

  • 开启日志标签富化,单击添加:

    • 环境变量相关:配置环境变量名和tag名,环境变量值将存放在tag名中。

      • 环境变量名:指定需要提取的环境变量名称。

      • tag:环境变量标签名称

    • Pod标签相关:配置Pod标签名和tag名,Pod标签值将存放在tag名中。

      • Pod标签名:需要提取的 Kubernetes Pod 标签名称。

      • tag:标签名称。


日志传输压缩

输出配置

说明

Logtail 1.3.4及以上的版本支持zstd压缩。

  • lz4:压缩速度快,压缩率较低。

  • zstd:压缩率高,速度略低,内存占用高。

后续步骤

  1. 日志查询与分析可以使用内置的通过AI智能生成查询与分析语句(Copilot),自动生成查询分析语句。采集的每条容器文本日志中默认包含以下字段信息:

    字段名称

    说明

    __tag__:__hostname__

    容器宿主机的名称。

    __tag__:__path__

    容器内日志文件的路径。

    __tag__:_container_ip_

    容器的IP地址。

    __tag__:_image_name_

    容器使用的镜像名称。

    __tag__:_pod_name_

    Pod的名称。

    __tag__:_namespace_

    Pod所属的命名空间。

    __tag__:_pod_uid_

    Pod的唯一标识符(UID)。

  2. 数据可视化:借助可视化仪表盘监控关键指标趋势。

  3. 数据异常自动预警:设置告警策略,实时感知系统的异常情况。

容器日志采集无数据排查思路

  1. 检查是否有增量日志:配置LoongCollector(Logtail)采集后,如果待采集的日志文件没有新增日志,则LoongCollector(Logtail)不会采集该文件。

2.查看LoongCollector(Logtail)运行日志

查看LoongCollector(Logtail)其自身的运行日志以获取详细错误信息。

  1. 登录Logtail容器

    1. 查询LogtailPod。

      kubectl get po -n kube-system | grep logtail

      系统将返回如下类似结果。

      logtail-ds-****d                                             1/1       Running    0          8d
      logtail-ds-****8                                             1/1       Running    0          8d
    2. 登录Pod。

      kubectl exec -it -n kube-system logtail-ds-****d -- bash

      其中,logtail-ds-****dPod ID,请根据实际值替换。

  1. 查看Logtail运行日志

    Logtail日志存储在Logtail容器中的/usr/local/ilogtail/目录中,文件名为ilogtail.LOGlogtail_plugin.LOG。登录Logtail容器,执行以下命令查看日志文件:

    打开/usr/local/ilogtail/目录。
    cd /usr/local/ilogtail
    
    查看ilogtail.LOGlogtail_plugin.LOG文件。
    cat ilogtail.LOG
    cat logtail_plugin.LOG

    目的:查看错误日志的告警类型,并根据日志服务采集数据常见的错误类型查询对应的解决办法。

3.检查机器组心跳

检查机器组心跳状态:前往image资源 > 机器组页面,单击目标机器组名称,在机器组配置 > 机器组状态区域,查看心跳状态并记录心跳状态为ok的节点数。

  1. 检查容器集群中Worker节点数。

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

    2. 查看集群中Worker节点数。

      kubectl get node | grep -v master

      系统会返回如下类似结果。

      NAME                                 STATUS    ROLES     AGE       VERSION
      cn-hangzhou.i-bp17enxc2us3624wexh2   Ready     <none>    238d      v1.10.4
      cn-hangzhou.i-bp1ad2b02jtqd1shi2ut   Ready     <none>    220d      v1.10.4
  2. 对比心跳状态为OK的节点数是否和容器集群中Worker节点数一致。根据对比结果选择排查方式。

    • 机器组中所有节点的心跳状态均为Failed

      • 如果是自建集群,请检查以下参数是否配置正确:{regionId}{aliuid}{access-key-id}{access-key-secret}是否已正确填写。

        如果填写错误,请执行helm del --purge alibaba-log-controller命令,删除安装包,然后重新安装。

    • 机器组心跳状态为OK的节点数量少于集群中的Worker节点数量。

      • 判断是否已使用YAML文件手动部署DaemonSet。

        1. 执行如下命令。如果存在返回结果,则表示之前已使用YAML文件手动部署DaemonSet。

          kubectl get po -n kube-system -l k8s-app=logtail
        2. 下载最新版本DaemonSet模板。

        3. 根据实际值,配置${your_region_name}${your_aliyun_user_id}${your_machine_group_name}等参数。

        4. 更新资源。

          kubectl apply -f ./logtail-daemonset.yaml

4.检查采集配置过滤条件

在日志服务控制台,检查Logtail采集配置。重点关注Logtail配置中的IncludeLabelExcludeLabelIncludeEnvExcludeEnv等配置是否符合采集需求。

  • 此处的Label为容器Label,即Docker inspect中的Label,不是Kubernetes中的Label。

  • 可将IncludeLabelExcludeLabelIncludeEnvExcludeEnv配置临时去除,查看是否可以正常采集到日志。如果可以,则说明是上述参数的配置存在问题。

常见问题

如何将ACK集群日志传输到另一个阿里云账号的Project?

通过在ACK集群中手动安装日志服务 LoongCollector(Logtail) 组件,并为其配置目标账号的主账号ID或访问凭证(AccessKey),即可实现将容器日志发送到另一个阿里云账号的日志服务Project中。

场景描述:当因为组织架构、权限隔离或统一监控等原因,需要将某个ACK集群的日志数据采集到另一个独立的阿里云账号的日志服务Project时,可通过手动安装 LoongCollector(Logtail)进行跨账号配置。

操作步骤:此处以手动安装LoongCollector为例,如需了解如何安装Logtail,请参考Logtail安装与配置

  1. 连接Kubernetes集群,根据地域选择对应命令,下载LoongCollector及其依赖组件:

    中国地域:

    wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh

    海外地域:

    wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
  2. 进入loongcollector-custom-k8s-package目录,修改配置文件./loongcollector/values.yaml

    # ===================== 必需要补充的内容 =====================
    # 本集群要采集的Project名,例如 k8s-log-custom-sd89ehdq
    projectName: ""
    # Project所属地域,例如上海:cn-shanghai
    region: ""
    # Project所属主账号uid,请用引号包围,例如"123456789"
    aliUid: ""
    # 使用网络,可选参数:公网Internet,内网Intranet,默认使用公网
    net: Internet
    # 主账号或者子账号的AK,SK,需具备AliyunLogFullAccess系统策略权限
    accessKeyID: ""
    accessKeySecret: ""
    # 自定义集群ID,命名只支持大小写,数字,短划线(-)。
    clusterID: ""
  3. loongcollector-custom-k8s-package目录,执行如下命令,安装LoongCollector及其他依赖组件:

    bash k8s-custom-install.sh install
  4. 安装完成后,查看组件运行状态。

    Pod未成功启动,请确认values.yaml配置是否正确,相关镜像拉取是否成功。
    # 检查Pod状态
    kubectl get po -n kube-system | grep loongcollector-ds

    同时,日志服务会自动创建如下资源,可登录日志服务控制台查看

    资源类型

    资源名称

    作用

    Project

    values.yaml文件中自定义的projectName的值

    资源管理单元,隔离不同业务日志。

    如需自行创建Project以实现更灵活的日志资源管理,请参考创建Project

    机器组

    k8s-group-${cluster_id}

    日志采集节点集合。

    Logstore

    config-operation-log

    重要

    请不要删除该Logstore。

    用于存储loongcollector-operator组件的日志,其收费标准与普通Logstore完全相同,具体请参见按写入数据量计费模式计费项。建议不要在此Logstore下创建采集配置。

如何让同一个日志文件或容器标准输出被多个采集配置同时采集

默认情况下,日志服务为了防止数据重复,限制了每个日志源只能被一个采集配置采集:

  • 一个 文本日志文件只能匹配一个 Logtail 采集配置;

  • 一个 容器的标准输出(stdout) 也只能被一个标准输出采集配置采集。

  1. 登录日志服务控制台,进入目标Project。

  2. 在左侧导航选择image日志库,找到目标Logstore。

  3. 单击其名称前的image展开Logstore。

  4. 单击Logtail配置,在配置列表中,找到目标Logtail配置,单击操作列的管理Logtail配置

  5. Logtail配置页面,单击编辑,下滑至输入配置区域:

    • 采集文本文件日志:开启允许文件多次采集

    • 采集容器标准输出:开启允许标准输出多次采集

更多信息

全局配置参数介绍

配置项

说明

配置名称

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

日志主题类型

选择日志主题(Topic)的生成方式。包含机器组Topic,文件路径提取,自定义三种方式。

高级参数

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

输入配置参数介绍

配置项

说明

Logtail部署模式

DaemonSet:在集群的每个Node节点上部署一个 LoongCollector,负责采集该节点上所有容器的日志。

Sidecar:每个容器组(Pod)运行一个LoongCollector容器,用于采集当前容器组(Pod)所有容器(Containers)的日志。不同Pod的日志采集相互隔离。

文件路径类型

支持配置容器内路径宿主机路径

  • 容器内路径:采集容器内文本日志文件时,请选择容器内路径。

  • 宿主机路径:采集集群节点上的服务日志时,请选择宿主机路径。

文件路径

根据日志在主机(例如ECS)上的位置,设置日志目录和文件名称。

  • 如果目标主机是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配置后,查看容器元信息,包括匹配容器信息和全量容器信息。

容器过滤

  • 过滤条件说明

重要
  • 容器LabelDocker inspect中的Label,不是Kubernetes中的Label。如何获取,请参见获取容器Label

  • 环境变量为容器启动中配置的环境变量信息。如何获取,请参见获取容器环境变量

  • Kubernetes场景下,推荐使用Kubernetes层级的信息(K8s Pod名称正则匹配K8s Namespace正则匹配K8s容器名称正则匹配K8s Pod标签白名单等)进行容器过滤。

  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白名单,那么LabelKey必填,LabelValue可选填。

  • 如果LabelValue为空,则容器Label中包含LabelKey的容器都匹配。

  • 如果LabelValue不为空,则容器Label中包含LabelKey=LabelValue的容器才匹配。

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

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

容器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的容器。

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

K8s Pod标签白名单

通过Kubernetes Label白名单指定待采集的容器。如要设置Kubernetes Label白名单,那么LabelKey必填,LabelValue可选填。

  • 如果LabelValue为空,则Kubernetes Label中包含LabelKey的容器都匹配。

  • 如果LabelValue不为空,则Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。

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

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

说明
  • 由于在Kubernetes管控类资源(例如Deployment)运行时更改Label,不会重启具体的工作资源Pod,因此Pod无法感知此变更,可能导致匹配规则失效。设置K8s Label黑白名单时,请以Pod中的Kubernetes Label为准。关于Kubernetes Label的更多信息,请参见Labels and Selectors

K8s Pod标签黑名单

通过Kubernetes Label黑名单排除不采集的容器。如要设置Kubernetes Label黑名单,那么LabelKey必填,LabelValue可选填。

  • 如果LabelValue为空,则Kubernetes Label中包含LabelKey的容器都被排除。

  • 如果LabelValue不为空,则Kubernetes Label中包含LabelKey=LabelValue的容器才会被排除。

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

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

说明
  • 由于在Kubernetes管控类资源(例如Deployment)运行时更改Label,不会重启具体的工作资源Pod,因此Pod无法感知此变更,可能导致匹配规则失效。设置K8s Label黑白名单时,请以Pod中的Kubernetes Label为准。关于Kubernetes Label的更多信息,请参见Labels and Selectors

日志标签富化

可将环境变量和Kubernetes Label添加到日志,作为日志标签。

环境变量相关

设置环境变量扩展字段后,日志服务将在日志中新增环境变量相关字段。例如设置环境变量名VERSION,设置tagenv_version,当容器中包含环境变量VERSION=v1.0.0时,会将该信息添加到日志中,即添加字段__tag__:__env_version__: v1.0.0

Pod标签相关

设置Kubernetes Pod扩展字段后,日志服务将在日志中新增Kubernetes Pod相关字段。例如设置Pod标签名app,设置tagk8s_pod_app,当Kubernetes中包含Labelapp=serviceA时,会将该信息添加到日志中,即添加字段__tag__:__k8s_pod_app__: serviceA

文件编码

选择日志文件的编码格式。

首次采集大小

配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为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流水线配置

处理配置参数介绍

配置项

说明

日志样例

待采集日志的样例,请务必使用实际场景的日志。日志样例可协助配置日志处理相关参数,降低配置难度。支持添加多条样例,总长度不超过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