iLogtail
是阿里云日志服务(SLS)团队自研的可观测数据采集Agent
,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes
等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和容器的可观测性采集工作,在阿里巴巴集团的核心产品线,如淘宝、天猫、支付宝、菜鸟、高德地图等也是默认的日志、监控、Trace
等多种可观测数据的采集工具。目前iLogtail已有千万级的安装量,每天采集数十PB的可观测数据,广泛应用于线上监控、问题分析/定位、运营分析、安全分析等多种场景,在实战中验证了其强大的性能和稳定性。
在当今云原生的时代,我们坚信开源才是iLogtail最优的发展策略,也是释放其最大价值的方法。因此,我们决定将iLogtail
开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。
背景
日志作为可观测性建设中的重要一环,可以记录详细的访问请求以及错误信息,在业务分析、问题定位等方面往往会发挥很大的作用。一般开发场景下,当需要进行日志分析时,往往是直接在日志文件中进行grep
搜索对应的关键字;但在大规模分布式生产环境下,此方法效率低下,常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集、管理、分析。
目前行业上主流的开源方案,分成了5个部分。
- 采集端:承载可观测数据采集及一部分前置的数据处理功能。随着云原生的发展,采集端也需要适应时代潮流,提供对
K8s
采集的友好支持。常见的采集端有Filebeat
、FluentD/Fluent-bIt
,以及我们开源的iLogtail
。 - 消息队列:采集
Agent
往往不会直接将采集到的数据发送到存储系统,而是写入消息队列,起到削峰填谷的作用,避免流量洪峰导致存储系统宕机。常见消息队列为Kafka
、RabbitMQ
等。 - 计算:用于消费消息队列中的数据,经过处理、聚合后输出到存储系统。比较常见的为Flink、Logstash等。
- 存储分析引擎:提供采集数据持久化存储能力,并提供查询分析能力。常见的存储分析引擎为
Elasticsearch
、ClickHouse
及Loki
。 - 可视化:借助
Kibana
和Grafana
提供采集数据的可视化能力。
iLogtail
作为可观测数据采集器,致力于打造统一的数据采集层。提供了数十种数据源的采集能力,及丰富的处理能力,具有高性能、高可靠的特点。iLogtail
社区版源自企业版iLogtail
,核心采集处理能力完全对标企业版,完全可以应对大规模线上使用的场景。完整对比详见 社区版和企业版的对比说明。
注:日志服务SLS作为云原生的可观测平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。同时一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,具备上图中2、3、4、5所有的能力。iLogtail
企业版作为SLS官方标配的可观测数据采集器,可以无缝集成,提供一站式便捷的采集能力。
原理介绍
iLogtail
采用PipeLine
的设计,数据处理有较强的扩展性。当文本文件采集后,会经过采集配置中设定的Processor
处理,之后经过Aggregator
插件打包,最终通过Flusher
发送到日志存储系统。
此外,iLogtail
对于文本处理的场景,也提供了C++
加速处理能力,可以显著提升日志处理效率。C++加速不在本文讨论范围,敬请期待后续分享文章。
场景实战
本文将会详细介绍使用iLogtail
社区版进行日志采集时,对于常见日志格式的处理实战。为了便于调测,以下样例默认将采集到的日志,经过处理后,输出到标准输出,开发者可以根据实际需求进行适当的调整。
场景1 -- 正则表达式解析及响应过滤
场景描述
按照正则解析请求日志格式,并且只采集status
异常的日志,即不采集200的日志。
实现机制
这里需要用到两个插件:
- 首先使用processor_regex进行日志字段提取,需要注意正则中的
()
,需要与提取出来的Keys
严格对应。 - 使用processor_filter_regex进行过滤处理,不采集
status
为200的日志。
实战
- 输入
echo '127.0.0.1 - - [10/Aug/2022:14:57:51 +0800] "POST /PutData?Category=YunOsAccountOpLog" 0.024 18204 200 37 "-" "aliyun-sdk-java"' >> /home/test-log/proccessor-input.log
echo '127.0.0.1 - - [10/Aug/2022:14:57:52 +0800] "POST /PutData?Category=YunOsAccountOpLog" 0.14 18200 404 37 "-" "aliyun-sdk-java"' >> /home/test-log/proccessor-input.log
- 采集配置
enable: true
inputs:
- Type: file_log
LogPath: /home/test-log/
FilePattern: proccessor-input.log
processors:
- Type: processor_regex
SourceKey: content
Regex: ([\d\.]+) \S+ \S+ \[(\S+) \S+\] \"(\w+) ([^\\"]*)\" ([\d\.]+) (\d+) (\d+) (\d+|-) \"([^\\"]*)\" \"([^\\"]*)\"
Keys:
- ip
- time
- method
- url
- request_time
- request_length
- status
- length
- ref_url
- browser
- Type: processor_filter_regex
Exclude:
status: "200"
flushers:
- Type: flusher_stdout
OnlyStdout: true
- 输出
{
"__tag__:__path__": "/home/test-log/proccessor-input.log",
"ip": "127.0.0.1",
"time": "10/Aug/2022:14:57:52",
"method": "POST",
"url": "/PutData?Category=YunOsAccountOpLog",
"request_time": "0.14",
"request_length": "18200",
"status": "404",
"length": "37",
"ref_url": "-",
"browser": "aliyun-sdk-java",
"__time__": "1659884519"
}
场景2 -- Json格式解析及字段取值过滤
场景描述
采集的日志格式为Json
,按照Json
解析后,进行日志内容进行过滤。只采集ip
以10开头、method
为POST
且browser
不为aliyun.*
的日志。
实现机制
这里需要用到两个插件:
- 因为原始日志时
Json
格式,所以需要首先使用processor_json进行日志的解析,处理后可以得到kv
形式字段。 - 使用processor_filter_regex进行过滤处理,只保留符合条件的日志。该插件可以支持多个字段的取值组合。
实战
- 输入
echo '{"ip": "10.**.**.**", "method": "POST", "brower": "aliyun-sdk-java"}' >> /home/test-log/proccessor-input.log
echo '{"ip": "10.**.**.**", "method": "POST", "brower": "chrome"}' >> /home/test-log/proccessor-input.log
echo '{"ip": "192.168.**.**", "method": "POST", "brower": "aliyun-sls-ilogtail"}' >> /home/test-log/proccessor-input.log
- 采集配置
- 需要特别注意,10开头的IP需要与100开头的区分开,因此正则应该是
10\..*
。
enable: true
inputs:
- Type: file_log
LogPath: /home/test-log/
FilePattern: proccessor-input.log
processors:
- Type: processor_json
SourceKey: content
KeepSource: false
ExpandDepth: 1
ExpandConnector: ""
- Type: processor_filter_regex
Include:
ip: 10\..*
method: POST
Exclude:
brower: aliyun.*
flushers:
- Type: flusher_stdout
OnlyStdout: true
- 输出
{
"__tag__:__path__": "/home/test-log/proccessor-input.log",
"ip": "10.**.**.**",
"method": "POST",
"brower": "chrome",
"__time__": "1659881747"
}
场景3 -- 多行日志解析
场景描述
多行文本日志即默认一条日志有多行内容,常见于Java程序异常调用栈打印。iLogtail通过行首正则表达式去匹配一条日志的行首,未匹配部分为该条日志的一部分。
本例以时间开头的行作为开头,进行多行日志解析。
实现机制
需要借助processor_split_log_regex实现多行匹配,使用时需要根据日志特点指定行首正则。
实战
- 输入
echo -e '[2022-03-03 18:00:00] xxx1\nyyyyy\nzzzzzz\n[2022-03-03 18:00:01] xxx2\nyyyyy\nzzzzzz' >> /home/test-log/proccessor-input.log
- 采集配置
enable: true
inputs:
- Type: file_log
LogPath: /home/test-log/
FilePattern: proccessor-input.log
processors:
- Type: processor_split_log_regex
SplitRegex: \[\d+-\d+-\d+\s\d+:\d+:\d+]\s.*
SplitKey: content
PreserveOthers: true
flushers:
- Type: flusher_stdout
OnlyStdout: true
- 输出
{
"__tag__:__path__": "/home/test-log/multiline.log",
"content": "[2022-03-03 18:00:00] xxx1\nyyyyy\nzzzzzz\n",
"__time__": "1657367638"
}
{
"__tag__:__path__": "/home/test-log/multiline.log",
"content": "[2022-03-03 18:00:01] xxx2\nyyyyy\nzzzzzz",
"__time__": "1657367638"
}
场景4 -- 混合日志模式解析
场景描述
有时业务日志不是单一的Json
模式,可能嵌套了其他的模式,这时候如果用正则去匹配会比较复杂。iLogtail
数据处理pipeline
的设计可以对原始日志进行层层提取。
本例对主体为key-value
格式,但是其中部分字段嵌套Json
的日志内容进行解析处理。
实现机制
- 首先借助processor_split_key_value进行key-value对的提取。
- 利用processor_json对Json内容进行解析。
- 利用processor_drop剔除不需要的字段。
实战
- 输入
echo -e "time:2017.09.12 20:55:36\tjson:{\"key1\" : \"xx\", \"key2\": false, \"key3\":123.456, \"key4\" : { \"inner1\" : 1, \"inner2\" : false}}" >> /home/test-log/proccessor-input.log
- 采集配置
enable: true
inputs:
- Type: file_log
LogPath: /home/test-log/
FilePattern: proccessor-input.log
processors:
- Type: processor_split_key_value
SourceKey: content
Delimiter: "\t"
Separator: ":"
- Type: processor_json
SourceKey: json
KeepSource: false
ExpandDepth: 1
ExpandConnector: ""
- Type: processor_drop
DropKeys:
- key4
flushers:
- Type: flusher_stdout
OnlyStdout: true
- 输出
{
"__tag__:__path__": "/home/test-log/proccessor-input.log",
"content": "time:2017.09.12 20:55:36\tjson:{\"key1\" : \"xx\", \"key2\": false, \"key3\":123.456, \"key4\" : { \"inner1\" : 1, \"inner2\" : false}}",
"time": "2017.09.12 20:55:36",
"key1": "xx",
"key2": "false",
"key3": "123.456",
"__time__": "1659911138"
}
总结
以上,我们介绍了使用iLogtail
社区版对于常见日志格式解析处理的实战,可以应用于日志格式标准化处理、日志过滤等场景。当然iLogtail
还有众多数据处理插件可供选择,开发者可以基于我们的本篇实战分享及文档,构建属于自己的data_pipelines
。
我们也将一些常见的处理模版归档到GitHub供开发者使用,当然也希望开发者跟我们一起共建,将自己使用的案例分享给社区的所有开发人员。
关于iLogtail
iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。
GitHub:https://github.com/alibaba/ilogtail
社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme
企业版官网:https://help.aliyun.com/document_detail/65018.html