Logtail从入门到精通(四):正则表达式Java日志采集实战

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: 为简化日志接入门槛,我们提供了极简模式的日志解析方式(如[开启日志采集之旅]()中的介绍)。为了更好的对日志进行分析,我们还提供了其他解析方式,例如:分隔符模式、完整正则模式、JSON模式等。本文将为大家介绍如何使用完整正则解析模式。

前言


为简化日志接入门槛,我们提供了极简模式的日志解析方式(如开启日志采集之旅中的介绍)。为了更好的对日志进行分析,我们还提供了其他解析方式,例如:分隔符模式、完整正则模式、JSON模式等。本文将为大家介绍如何使用完整正则解析模式。


日志解析介绍


日志采集最终目的还是为了分析,通常分析都要基于结构化或半结构化的数据,因此日志解析是整个日志解决方案中非常重要的一个部分。解析可以理解为从无结构化到半结构化的过程,即将文件中一行或多行文本变为一个个key&value对。


示例


例如对以下日志/log/error.log:


[2018-05-11T20:10:16,000] [INFO] [SessionTracker] [SessionTrackerImpl.java:148] Expiring sessions
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x8F",...' for column 'data' at row 1
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLException


可以解析成


time : 2018-05-11T20:10:16,000
level : INFO
method : SessionTracker
file : SessionTrackerImpl
line : 148
message : Expiring sessions
            java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x8F",...' for column 'data' at row 1
            at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
            at org.springframework.jdbc.support.AbstractFallbackSQLException


解析所处阶段


对于不同的产品,日志解析在整个链路中所处的位置会有一定的区别,一般分为两类:schema on writeschema on read


  1. schema on write 是在进入存储系统前就已经将数据半结构化完毕。例如ES、GrayLog、MaxCompute等
  2. schema on read 在写入时并不进行解析,只存储原始数据,当读取时再进行解析。例如Splunk、Sumologic


关于schema on write 还是 schema on read 的比较这里就不再展开,目前日志服务是采用的schema on write形式,Logtail在写入前会将原始日志解析成Key&Value对。


解析方式


Logtail会不定期增加新的解析方式,具体可参考文本日志采集


正则解析配置


正则解析配置流程如下文所示,下面我们将以解析/log/error.log为示例来向大家介绍如何使用正则方式解析日志。


1a67d9ab-9b74-4a46-a1b0-188a0b7deebd.png


创建正则模式采集配置


  1. 在Logstore列表页面中,点击待存储logstore的数据接入向导图标。
  2. 选择自建软件中的文本文件
  3. 在跳转的采集配置页面中选择完整正则模式


44e2ad91-8ba0-4947-b04d-31442264e14f.png

3d8b41b7-a2d3-436e-837b-663a9be6c23d.png


533dd272-3404-4c96-9647-dd51494ac63d.png


正则解析配置


自动配置


为尽可能减轻您的配置负担,我们提供了自动生成的配置方式,您可以使用鼠标点击、拖拽即可完成采集配置。具体配置请参考以下视频:


此处为语雀视频卡片,点击链接查看:


手动配置


自动生成正则的配置方式较为简单,但有可能存在以下情况:


  1. 生成的正则并不一定能完全匹配您的日志模式
  2. 某些复杂的日志样例无法自动提取出可用模式
  3. 自动生成的正则匹配效率无法达到最优


因此某些情况下您还需要手动去提取正则。Logtail支持的是PCRE方式的正则表达式,建议您使用一些正则表达式工具进行编写和调试,例如regextester, regex101


手动配置正则模式主要分为下述三个过程


配置行首正则


对于Java应用中的程序日志,一条日志通常会跨越多行,因此只能通过日志开头的特征区分每条日志行首。这里我们的示例是一个典型的Java错误堆栈日志,因此需要配置行首正则表达式。


  • 注意:行首正则表达式需要完整匹配一行,因此一般在表达式最后加上.*


544484e5-8d74-4a22-aa5a-6ad670a9d991.png


解析字段


通过行首正则能够从原始文件中将日志一条条切分出来,接下来需要将切分后的整条日志再次分解成key&value对。


  • 注意:需要提取的字段用()包裹;key不要填在正则中,直接在控制台输入


ebd3a71b-9bfb-4aaf-94e7-0423711cf950.png


提取时间


每条日志在服务日志都必须包括该日志发生的时间戳信息。Logtail默认会将采集时间作为日志时间。如果您的日志中有时间信息,建议配置时间提取规则,将日志时间映射为日志服务中的日志时间戳。


Logtail时间解析使用的是UNIX的strftime规则,具体请参考配置时间格式


  • 注意:时间默认从日志key中的time字段提取


a330f935-e011-4e63-bfa9-9f17b203a79a.png


数据采集效果


5b4bc02f-bada-40f4-ba16-5ad02fac87e0.png


相关文档和参考


正则表达式采集配置


配置时间格式


索引与查询简介


schema-on-read-vs-schema-on-write-1


schema-on-read-vs-schema-on-write-2

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
元乙
+关注
目录
打赏
0
0
0
1
79058
分享
相关文章
|
1月前
|
《从头开始学java,一天一个知识点》之:控制流程:if-else条件语句实战
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列为你打造Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可完成学习。直击高频考点和实际开发中的「坑位」,拒绝冗长概念,每篇都有可运行的代码示例。明日预告:《for与while循环的使用场景》。 ---
62 19
突破极限: 高负载场景下的单机300M多行正则日志采集不是梦
在当今数字化时代,日志数据已成为企业 IT 运营和业务分析的关键资源。然而,随着业务规模的扩大和系统复杂度的提升,日志数据的体量呈现爆发式增长,给日志采集和处理系统带来了巨大挑战。
283 93
|
4天前
|
【Java并发】【原子类】适合初学体质的原子类入门
什么是CAS? 说到原子类,首先就要说到CAS: CAS(Compare and Swap) 是一种无锁的原子操作,用于实现多线程环境下的安全数据更新。 CAS(Compare and Swap) 的
38 15
【Java并发】【原子类】适合初学体质的原子类入门
|
4天前
|
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
34 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
|
5天前
|
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
什么是ArrayBlockingQueue ArrayBlockingQueue是 Java 并发编程中一个基于数组实现的有界阻塞队列,属于 java.util.concurrent 包,实现了 Bl...
41 6
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
|
2月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
196 60
【Java并发】【线程池】带你从0-1入门线程池
|
12天前
|
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
前言 什么是ReentrantLock? ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个类,它实现了 Lock 接口,提供了与
57 10
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
|
4天前
|
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
前言 你是否在线程池工具类里看到过它的身影? 你是否会好奇LinkedBlockingQueue是啥呢? 没有关系,小手手点上关注,跟上主播的节奏。 什么是LinkedBlockingQueue? ...
26 1
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
JVM实战—7.如何模拟GC场景并阅读GC日志
本文主要介绍了:如何动手模拟出频繁Young GC的场景、JVM的Young GC日志应该怎么看、编写代码模拟动态年龄判定规则进入老年代、编写代码模拟S区放不下部分进入老年代、JVM的Full GC日志应该怎么看。
JVM实战—7.如何模拟GC场景并阅读GC日志

云存储

+关注

相关产品

  • 日志服务