200%性能提升: 阿里云SLS标准输出日志采集新方案


核心升级要点

本次升级面向容器化场景下标准输出日志采集痛点,推出全新C++重构的日志采集插件(支持Logtail v2.1.5.0及以上版本和 LoongCollector),主要改进包括:

  • 性能提升:单线程采集速度提升180%-300%
  • 可靠性增强:支持日志轮转队列,改进容器的标准输出文件快速轮转下的日志采集场景
  • 资源优化:CPU/内存消耗降低20%
  • 处理能力:支持正则、JSON、脱敏等多线程原生处理插件
  • 统一体验:参数命名/元数据字段/存储格式与文件采集对齐

背景

在云原生技术快速发展的今天,容器化应用已成为企业数字化转型的基石。特别是在大规模Kubernetes集群场景中,面对高并发标准输出日志写入、瞬时日志量激增等复杂场景,日志采集组件的健壮性和效率面临更高要求。

当前阿里云SLS标准输出采集插件需要提高极端场景下的表现:

  • 高并发场景优化
    • 针对极端场景下的日志快速轮转机制进行持续优化,提升采集稳定性。
  • 性能持续演进
    • 基于Golang实现的旧版标准输出采集插件方案已服务大量客户场景。
    • 旧版插件由Golang实现,极限性能弱于C++,资源占用多于C++。
    • 为满足更高性能需求,需要推出新一代标准输出采集插件。
  • 体验统一规划
    • 参数命名存在历史版本差异(如首次采集文件大小参数,文件采集为TailSizeKB,旧版标准输出采集为StartLogMaxOffset)。
    • Tag日志存储位置不统一,导致消费端需维护两套处理逻辑。
    • 容器元信息字段命名不一致(例如文件采集使用__tag__:_image_name_,旧版插件使用_image_name_)。

基于云原生技术发展趋势和客户场景需求,阿里云日志服务推出全新升级的标准输出采集插件,为容器化环境提供更强大的日志采集能力,以满足更多客户需求和使用场景。

新版标准输出采集插件的核心优势

新版标准输出插件优势(C++版本)
性能大幅提升采用C++重构,性能较Go版本提升180%-300%
支持原生插件处理数据,多线程并行处理,充分利用系统资源
原生插件与Go插件灵活组合
更强的可靠性支持标准输出日志轮转队列,日志采集机制和文件采集机制统一,在标准输出日志快速轮转时的场景可靠性高
更低的资源消耗CPU使用率降低20%-25%
内存占用减少20%-25%
运维一致性新版标准输出采集插件的参数和文件采集插件的参数进行了统一
容器元信息字段命名和Tag日志存储位置,与文件采集场景进行了统一,消费端只需维护同套处理逻辑

插件配置入口

配置方式说明

提供两种标准输出日志采集配置方式:

  1. 控制台可视化配置 支持Logtail (v2.1.5.0及以上版本) 和 LoongCollector,通过SLS控制台完成图形化配置:

  1. 工程化配置 通过以下方式满足CI/CD需求:

我们也提供了采集配置生成器,可以辅助您可视化配置CRD YAML参数或者API JSON参数。

性能对比:数据说话

为了比较 新版标准输出采集插件旧版标准输出采集插件 的性能差距,我们在ack上进行了以下性能测试

  • 测试的机器规格相同
    • ecs.c7.4xlarge (16 vCPU 32 GiB, 计算型 c7)
    • 2048GB ESSD云盘 PL3

  • 相同的采集配置,只配置行首正则 cnt.*
  • 实时生成相同的测试日志
cnt:13472391,thread:2,log:Exception in thread "main" java.lang.NullPointerExceptionat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitleat com.example.myproject.Book.getTitle
at com.example.myproject.Book.getTitle
at com.example.myproject.Book.getTitle
at com.example.myproject.Book.getTitle

单节点同时运行4个容器打印日志下的测试结果

containerd场景docker场景
新版标准输出采集
(单线程)
旧版标准输出采集插件新旧插件的性能比对新版标准输出采集
(单线程)
采集速度(M/s)26588提升 +300%170
cpu155195降低 -20%150
mem145200降低-25%160

在相同测试条件下(单节点4容器并发输出),新版插件表现优异:

  • Containerd环境:
    • 采集速度提升300%(265MB/s vs 88MB/s)
    • CPU使用率降低20%
    • 内存占用降低25%
  • Docker环境:
    • 采集速度提升180%(170MB/s vs 94MB/s)
    • CPU使用率降低25%
    • 内存占用降低20%

(注:本文数据基于测试环境,实际效果可能因具体环境有所差异)

最佳实践-标准输出日志脱敏应用案例

传统方案中,旧版标准输出采集插件仅支持性能受限的字符串替换插件Go版脱敏插件,存在以下局限:

  1. 扩展插件性能不足且缺乏多线程支持
  2. 复杂脱敏规则易导致采集延迟甚至数据丢失

新版标准输出采集插件通过以下改进实现高效脱敏:

  1. 采集性能提升180%-300%
  2. 支持高性能原生脱敏插件(C++实现)
  3. 支持通过Logtail启动参数调优实现多线程扩展

以下是典型脱敏场景的配置方案:

需要脱敏 特定格式的日志内容

例如

# 原始日志
"验证码"='12345', pwd="123123", '验证码':123123123
# 脱敏日志
"验证码"='******', pwd="******", '验证码':******

| 表单
| yaml
plain - Type: processor_desensitize_native SourceKey: content ReplacedContentPattern: >- [^,,'\]"\\]+ ContentPatternBeforeReplacedString: >- ((?i)密码|验证码|\bpwd\b|\bphone\b)[\\]*['"]?\s*[::=]\s*[\\]*['"]? ReplacingAll: true ReplacingString: '******' Method: const | | :--- | :--- |

需要全文脱敏手机号中间四位**(13123456789 -> **131****6789),可参考以下原生脱敏插件的配置

| 表单
| yaml
plain - Type: processor_desensitize_native SourceKey: content ReplacedContentPattern: '(^|[^0-9a-zA-Z])(1)([0-9]{2})(\d{4})(\d{4})([^0-9]|$)' ContentPatternBeforeReplacedString: . ReplacingAll: true ReplacingString: \2\3\4****\6\7 Method: const | | :--- | :--- |

需要全文脱敏邮箱前缀**(testemail@www.com -> t*l@www.com),可参考以下原生脱敏插件的配置

| 表单
| yaml
plain - Type: processor_desensitize_native SourceKey: content ReplacedContentPattern: '(\w{1})(\w)+(\.\w+)*@(\w+)(.com|.cn)' ContentPatternBeforeReplacedString: . ReplacingAll: true ReplacingString: \2***\4@\5\6 Method: const | | :--- | :--- |


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32