Logstash,Fluentd, Logtail对比伤害
摘要: 针对主流日志采集客户端(Logstash,Fluentd,以及日志服务客户端Logtail)进行功能、性能和稳定性测评
日志收集的场景
DT时代,数以亿万计的服务器、移动终端、网络设备每天产生海量的日志。
中心化的日志处理方案有效地解决了在完整生命周期内对日志的消费需求,而日志从设备采集上云是始于足下的第一步。

三款日志收集工具
logstash
开源界鼎鼎大名ELK stack中的"L",社区活跃,生态圈提供大量插件支持。
logstash基于JRuby实现,可以跨平台运行在JVM上。
模块化设计,有很强的扩展性和互操作性。
fluentd
开源社区中流行的日志收集工具,td-agent是其商业化版本,由Treasure Data公司维护,是本文选用的评测版本。
fluentd基于CRuby实现,并对性能表现关键的一些组件用C语言重新实现,整体性能不错。
fluentd设计简洁,pipeline内数据传递可靠性高。相较于logstash,其插件支持相对少一些。
logtail
阿里云日志服务的生产者,目前在阿里集团内部机器上运行,经过3年多时间的考验,目前为阿里公有云用户提供日志收集服务。
采用C++语言实现,对稳定性、资源控制、管理等下过很大的功夫,性能良好。相比于logstash、fluentd的社区支持,logtail功能较为单一,专注日志收集功能。
日志文件收集场景 - 功能对比
| 功能项 | logstash | fluentd | logtail |
|---|---|---|---|
| 日志读取 | 轮询 | 轮询 | 事件触发 |
| 文件轮转 | 支持 | 支持 | 支持 |
| Failover处理 (本地checkpoint) | 支持 | 支持 | 支持 |
| 通用日志解析 | 支持grok(基于正则表达式)解析 | 支持正则表达式解析 | 支持正则表达式解析 |
| 特定日志类型 | 支持delimiter、key-value、json等主流格式 | 支持delimiter、key-value、json等主流格式 | 支持key-value格式 |
| 数据发送压缩 | 插件支持 | 插件支持 | LZ4 |
| 数据过滤 | 支持 | 支持 | 支持 |
| 数据buffer发送 | 插件支持 | 插件支持 | 支持 |
| 发送异常处理 | 插件支持 | 插件支持 | 支持 |
| 运行环境 | JRuby实现,依赖JVM环境 | CRuby、C实现,依赖Ruby环境 | C++实现,无特殊要求 |
| 线程支持 | 支持多线程 | 多线程受GIL限制 | 支持多线程 |
| 热升级 | 不支持 | 不支持 | 支持 |
| 中心化配置管理 | 不支持 | 不支持 | 支持 |
| 运行状态自检 | 不支持 | 不支持 | 支持cpu/内存阈值保护 |
日志文件收集场景 - 性能对比
日志样例
以Nginx的access log为样例,如下一条日志365字节,结构化成14个字段:

在接下来的测试中,将模拟不同的压力将该日志重复写入文件,每条日志的time字段取当前系统时间,其它13个字段相同。
相比于实际场景,模拟场景在日志解析上并无差异,有一点区别是:较高的数据压缩率会减少网络写出流量。
logstash
logstash-2.0.0版本,通过grok解析日志并写出到kafka(内置插件,开启gzip压缩)。
日志解析配置:
- grok {
- patterns_dir=>"/home/admin/workspace/survey/logstash/patterns"
- match=>{ "message"=>"%{IPORHOST:ip} %{USERNAME:rt} - \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url}\" %{NUMBER:status} %{NUMBER:size} \"%{DATA:ref}\" \"%{DATA:agent}\" \"%{DATA:cookie_unb}\" \"%{DATA:cookie_cookie2}\" \"%{DATA:monitor_traceid}\" %{WORD:cell} %{WORD:ups} %{BASE10NUM:remote_port}" }
- remove_field=>["message"]
- }
测试结果:
| 写入TPS | 写入流量 (KB/s) | CPU使用率 (%) | 内存使用 (MB) |
|---|---|---|---|
| 500 | 178.22 | 22.4 | 427 |
| 1000 | 356.45 | 46.6 | 431 |
| 5000 | 1782.23 | 221.1 | 440 |
| 10000 | 3564.45 | 483.7 | 450 |
fluentd
td-agent-2.2.1版本,通过正则表达式解析日志并写入kafka(第三方插件fluent-plugin-kafka,开启gzip压缩)。
日志解析配置:
- <source>
- type tail
- format /^(?<ip>\S+)\s(?<rt>\d+)\s-\s\[(?<time>[^\]]*)\]\s"(?<url>[^\"]+)"\s(?<status>\d+)\s(?<size>\d+)\s"(?<ref>[^\"]+)"\s"(?<agent>[^\"]+)"\s"(?<cookie_unb>\d+)"\s"(?<cookie_cookie2>\w+)"\s"(?
- <monitor_traceid>\w+)"\s(?<cell>\w+)\s(?<ups>\w+)\s(?<remote_port>\d+).*$/
- time_format %d/%b/%Y:%H:%M:%S %z
- path /home/admin/workspace/temp/mock_log/access.log
- pos_file /home/admin/workspace/temp/mock_log/nginx_access.pos
- tag nginx.access
- </source>
测试结果:
| 写入TPS | 写入流量 (KB/s) | CPU使用率 (%) | 内存使用 (MB) |
|---|---|---|---|
| 500 | 178.22 | 13.5 | 61 |
| 1000 | 356.45 | 23.4 | 61 |
| 5000 | 1782.23 | 94.3 | 103 |
注:受GIL限制,fluentd单进程最多使用1个cpu核心,可以使用插件multiprocess以多进程的形式支持更大的日志吞吐。
logtail
logtail 0.9.4版本,设置正则表达式进行日志结构化,数据LZ4压缩后以HTTP协议写到阿里云日志服务,设置batch_size为4000条。
日志解析配置:
- logRegex : (\S+)\s(\d+)\s-\s\[([^]]+)]\s"([^"]+)"\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)"\s"(\d+)"\s"(\w+)"\s"(\w+)"\s(\w+)\s(\w+)\s(\d+).*
- keys : ip,rt,time,url,status,size,ref,agent,cookie_unb,cookie_cookie2,monitor_traceid,cell,ups,remote_port
- timeformat : %d/%b/%Y:%H:%M:%S
测试结果:
| 写入TPS | 写入流量 (KB/s) | CPU使用率 (%) | 内存使用 (MB) |
|---|---|---|---|
| 500 | 178.22 | 1.7 | 13 |
| 1000 | 356.45 | 3 | 15 |
| 5000 | 1782.23 | 15.3 | 23 |
| 10000 | 3564.45 | 31.6 | 25 |
单核处理能力对比

总结
可以看到三款日志工具各有特点:
logstash支持所有主流日志类型,插件支持最丰富,可以灵活DIY,但性能较差,JVM容易导致内存使用量高。
fluentd支持所有主流日志类型,插件支持较多,性能表现较好。
logtail占用机器cpu、内存资源最少,结合阿里云日志服务的E2E体验良好,但目前对特定日志类型解析的支持较弱,后续需要把这一块补起来。
Logstash,Fluentd, Logtail对比伤害的更多相关文章
- 为什么我们需要Logstash,Fluentd等日志摄取器?
前文传送门:Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 疑问:既然应用能直接向ElasticSearch写日志,为什么我们还 ...
- 【日志处理、监控ELK、Kafka、Flume等相关资料】
服务介绍 随着实时分析技术的发展及成本的降低,用户已经不仅仅满足于离线分析.目前我们服务的用户包括微博,微盘,云存储,弹性计算平台等十多个部门的多个产品的日志搜索分析业务,每天处理约32亿条(2TB) ...
- kubernetes常见日志采集问题和解决方案分析
传统日志与kubernetes日志对比 传统服务 目录固定 重启不会丢失 不用关注标准与错误日志输出 容器服务 节点不固定 重启服务会漂移 需要关注标准与错误日志输出 日志文件重启会丢失 日志目录不固 ...
- Docker处理日志的方法&日志收集工具比较
测试logstash:docker run -it mylogstash:0.1.0 logstash -e 'input{stdin{}}output{stdout{codec=>rubyde ...
- Kubernetes日志收集
关于kubernetes的日志分好几种,针对kubernetes本身而言有三种: 1.资源运行时的event事件.比如在k8s集群中创建pod之后,可以通过 kubectl describe pod ...
- Docker Daemon 参数最佳实践
1. Docker Daemon 配置参数 限制容器之间网络通信 在同一台主机上若不限制容器之间通信,容器之间就会暴露些隐私的信息,所以推荐关闭 docker daemon –icc=false 使用 ...
- 理解OpenShift(6):集中式日志处理
理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...
- Log system architecture
0. 技术选型参考 1. Collector Keywords: Collector, Processor 名称 Beats Fluentd-bit Introduction Beats are a ...
- [转帖] 中国SaaS死或生之二: ERP两大邪术,尽出歪门邪路 ---- 挺好玩的
中国SaaS死或生之二: ERP两大邪术,尽出歪门邪路 http://www.cniteyes.com/archives/33753 文章摘要:在数字化浪潮中,油腻ERP大叔的那些“歪门邪术” ...
随机推荐
- ASP.NET MVC5 +Abp 模板(Startup Templates)
官网:https://aspnetboilerplate.com/Templates 系统登陆初始账号:admin 密码:123qwe 调试错误: 1.在多语句事务内不允许使用 CREATE DATA ...
- 攻防世界--no-strings-attached
测试文件:https://adworld.xctf.org.cn/media/task/attachments/5d4117b968684b9483d0d4464e0a6fea 这道题要使用到gdb文 ...
- azkaban简单使用
步骤 1.通过web服务器创建项目,项目名称和描述都是必须填的2.上传zip包 job定义 1.简单的job一个job就是一个properties文件,只不过文件是以.job结尾,文件里面定义了job ...
- 【记录】mysql 查看某数据库各个表容量大小SQL
有时候我们可能需要了解数据库中各个表的容量及大小,好了解数据库情况. 现只需要一条SQL就可以直观的展示出来. SELECT table_schema AS '数据库', table_name AS ...
- C Primer Plus 学习 第三章
这里只记录我自己以前不懂得地方,明白的地方就略过了 位 字节 字 位 0,1 字节 8位 也就有8位0,1的组合 2的8次方的组合 字 设计计算机时给定的自然存储单元.8位 ...
- Springmvc上传过程中遇到的错误
问题1: org.springframework.web.util.NestedServletException: Handler processing failed; nested exceptio ...
- 从__name__=='__main__'说到__builtin__
一.__name__ 我们在写好代码进行自测的时候一般会先写这样一行代码: # inter_method if __name__ == '__main__': 为什么呢,可能并不是所有人都考虑过,这个 ...
- Sass函数:Sass Maps的函数-map-get($map,$key)
map-get($map,$key) 函数的作用是根据 $key 参数,返回 $key 在 $map 中对应的 value 值.如果 $key 不存在 $map中,将返回 null 值.此函数包括两个 ...
- BZOJ 2565 最长回文串
传送门 回文自动机! 正着跑一遍 记录以每个点作为回文子串的右端点的最大长度 倒过来跑一遍 记录每个点作为左端点的最大长度 求个和就好啦 附代码. #include<cstdio> #in ...
- maven插件之maven-surefire-plugin,junit单元测试报告和sonar测试覆盖率的整合说明
POM中配置的如下: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId> ...