iLogtail社区版使用入门 - iLogtail日志处理实战

本文涉及的产品
对象存储 OSS,20GB 3个月
云备份 Cloud Backup,100GB 3个月
文件存储 NAS,50GB 3个月
简介: 本文将会详细介绍使用iLogtail社区版进行日志采集时,对于常见日志格式的处理实战。为了便于调测,以下样例默认将采集到的日志,经过处理后,输出到标准输出,开发者可以根据实际需求进行适当的调整。

iLogtail是阿里云日志服务(SLS)团队自研的可观测数据采集Agent,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以署于物理机、虚拟机、Kubernetes等多种环境中来采集遥测数据。iLogtail在阿里云上服务了数万家客户主机和容器的可观测性采集工作,在阿里巴巴集团的核心产品线,如淘宝、天猫、支付宝、菜鸟、高德地图等也是默认的日志、监控、Trace等多种可观测数据的采集工具。目前iLogtail已有千万级的安装量,每天采集数十PB的可观测数据,广泛应用于线上监控、问题分析/定位、运营分析、安全分析等多种场景,在实战中验证了其强大的性能和稳定性。

在当今云原生的时代,我们坚信开源才是iLogtail最优的发展策略,也是释放其最大价值的方法。因此,我们决定将iLogtail开源,期望同众多开发者一起将iLogtail打造成世界一流的可观测数据采集器。

背景

日志作为可观测性建设中的重要一环,可以记录详细的访问请求以及错误信息,在业务分析、问题定位等方面往往会发挥很大的作用。一般开发场景下,当需要进行日志分析时,往往是直接在日志文件中进行grep搜索对应的关键字;但在大规模分布式生产环境下,此方法效率低下,常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集、管理、分析。

目前行业上主流的开源方案,分成了5个部分。

  • 采集端:承载可观测数据采集及一部分前置的数据处理功能。随着云原生的发展,采集端也需要适应时代潮流,提供对K8s采集的友好支持。常见的采集端有FilebeatFluentD/Fluent-bIt,以及我们开源的iLogtail
  • 消息队列:采集Agent往往不会直接将采集到的数据发送到存储系统,而是写入消息队列,起到削峰填谷的作用,避免流量洪峰导致存储系统宕机。常见消息队列为KafkaRabbitMQ等。
  • 计算:用于消费消息队列中的数据,经过处理、聚合后输出到存储系统。比较常见的为Flink、Logstash等。
  • 存储分析引擎:提供采集数据持久化存储能力,并提供查询分析能力。常见的存储分析引擎为ElasticsearchClickHouseLoki
  • 可视化:借助KibanaGrafana提供采集数据的可视化能力。

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开头、methodPOSTbrowser不为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的日志内容进行解析处理。

实现机制

实战

  • 输入

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
11天前
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
47 5
|
6天前
|
Java Maven Spring
超实用的SpringAOP实战之日志记录
【11月更文挑战第11天】本文介绍了如何使用 Spring AOP 实现日志记录功能。首先概述了日志记录的重要性及 Spring AOP 的优势,然后详细讲解了搭建 Spring AOP 环境、定义日志切面、优化日志内容和格式的方法,最后通过测试验证日志记录功能的准确性和完整性。通过这些步骤,可以有效提升系统的可维护性和可追踪性。
|
1月前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
22 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
3月前
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
118 2
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
3月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
55 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
116 0
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
57 0
|
3月前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
146 0
|
13天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
123 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板

相关产品

  • 日志服务