采集自动组合(如何使用完整正则模式来切分日志,实现对日志的解析 )
优采云 发布时间: 2021-10-24 14:03采集自动组合(如何使用完整正则模式来切分日志,实现对日志的解析
)
前言
为了简化文件日志的采集流程,Logtail提供了采集行的极简模式:日志以换行符分割,每一行作为一个日志。极简模式具有效率高、配置简单的优点,但它把整个日志的内容作为一个整体,不对单个日志的内容进行额外的分析,不能满足某些场景的需求。为此,我们还提供了其他的解析方式,例如:分隔符模式、全正则模式、JSON模式等。
本文将介绍如何使用完整的正则模式来实现日志解析,并介绍使用该模式时的一些最佳实践。
全正则模式介绍
全正则模式是通过正则表达式实现日志解析。正则表达式是用于匹配字符串中字符组合的模式。通俗地说,我们可以用它来表达我们想要什么样的日志。正则表达式有多种规范,包括Posix、Perl等,Logtail完整正则模式支持的语法符合Perl Regular(PCRE)规范(本文其余部分涉及的正则表达式将使用该规范编写)。
如上图所示,相比极简模式,完整的常规模式增加了以下功能:
提取字段
指定日志时间
接下来,我们将通过实际操作,帮助大家更好地了解如何使用完全正则模式的这三个功能。
准备好工作了
建议大家先到页面激活日志服务,创建必要的项目和日志库,这样大家就可以跟着本文的其余部分一起努力,加深对完整正则模式的各个选项的理解。
我们为每个用户提供每月一次,简单的试用不会花费你,不用担心~
首次完成新建项目和日志库后,会进入数据向导页面,如下图所示:
如果不小心退出了这个页面(或者不是第一次创建),也可以通过以下步骤进入:
进入数据向导页面后,请滑动至页面底部,选择自定义数据中的文本文件,如下图:
在点击进入的页面,选择完整的常规模式,会看到如下界面:
至此,我们的准备工作已经完成,接下来我们将依次为大家介绍完整正则模式的三个功能。
单行/多行日志
一般来说,日志文件是单行日志,比如Nginx日志、Apache日志等,示例如下:
127.0.0.1 - - [10/Sep/2018:12:36:49 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
127.0.0.1 - - [10/Sep/2018:12:36:50 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "http://127.0.0.1:8080/index.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
但是也有多行的日志,比如日志库打印的Java异常栈日志。示例如下:
[2018-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
[2018-10-01T10:30:31,000] [INFO] java.lang.Exception: another exception happened
at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
全正则模式支持同时解析以上两个日志,我们来看看如何配置。
单线配置
切换到全正则模式时,使用默认的单行配置,您只需将您的实际日志粘贴到日志示例文本框中即可,如下图所示:
多线配置
对于多行日志的配置,必须先关闭单行模式,然后在行首设置正则表达式。Logtail在行首引入正则表达式来区分两个多行日志如何拆分,因此正确设置行首正则表达式是拆分多行日志的关键。
以前面提到的Java异常堆栈日志为例。每条日志的开头都会有时间和日志级别,后续的日志内容一般不会有类似的内容。因此,我们可以根据这一点设置我们的行开始规则。表达式(同理,你需要在日志样本中粘贴你的实际日志,最好是两个以上)。
在行首自动生成正则表达式
为了简化您的操作,我们为您提供了自动生成正则表达式的功能。粘贴日志后,点击自动生成,如下图:
上面的例子中有几点值得我们注意:
注意:自动生成的行开始规律可能无法完全使用。建议您进行一定的调整和优化。手动调整行首正则表达式
自动生成行首正则表达式的功能非常方便,但有时它生成的内容可能无法满足您的需求。您可以点击 手动输入正则表达式,并在自动生成的基础上进行修改。当您进入手动输入正则表达式状态时,页面会出现一个验证按钮,通过该按钮可以验证当前输入的正则表达式可以从日志样本中匹配多少行日志,方便您进行现场调试。
如下图,我们对自动生成的行开始正则的第二部分(日志级别)进行了错误修改(去掉了+号),然后点击验证,我们会发现数字日志中的匹配项已变为 0。
提取字段
设置单行或多行以及行首的正则表达式后,我们可以将原创文件的内容分成几条日志。如果每个日志匹配某个模式,并且可以使用相同的正则表达式进行匹配,我们就可以提取每个日志的部分内容并将日志转换为键值对。
上述过程称为提取字段。默认情况下,完整的常规模式只会将每个日志作为一个整体发送到服务器。要启用此功能,您需要在页面上打开字段提取选项,如下图所示:
同样,为了您的方便,您也可以使用自动生成的方式为每个字段生成相应的正则表达式。开启提取字段选项后,日志样本文本框将变为可选区域。您可以在其上选择要提取的内容,然后单击弹出的正则按钮,为所选部分生成正则表达式。*敏*感*词*示例如下:
接下来,我们使用自动生成为前面的单行和多行示例提取字段。
单线配置
如图:
多线配置
如上图,整个生成过程基本类似,只是需要注意最后一个字段(message)。生成时,因为我们希望最后一个字段收录所有剩余的内容,所以我们跨越多行来选择日志内容。该字段对应的正则性(仅括号内)为([^:]+:\s\w+\s\w+\s[^:]+:\S+\s[^:]+:\S+\s\ S+)。事实上,这个规律是错误的(我们将在下面验证这一点):
这也反映了自动生成正则表达式的局限性。为此,您可以手动输入正则表达式进行一些修改,例如直接将最后一项修改为 ([\S\s]+) 这样的正则表达式 其余内容可以收录在字段中(包括行断)。
指定日志时间(可选)
在日志服务中,每条日志都必须收录日志发生的时间戳信息。默认情况下,Logtail会使用日志的采集时间作为它的日志时间(即使用系统时间选项),但是字段提取后,如果你的字段中有代表日志时间信息的字段,你可以指定该字段的名称为时间,然后为其配置时间格式,然后Logtail会将该字段的值解析为时间戳,然后与对应的日志相关联。
Logtail 使用 UNIX strptime 来分析时间格式。具体请参考文档配置时间格式。
这个功能和单行/多行日志没有区别。下面我们统一介绍一下操作流程:
将带有日志时间信息的字段名称指定为time,我们在之前的配置中已经操作过了。关闭使用系统时间的选项,在出现的时间转换格式文本框中填写时间格式。
同样,我们也提供了一个自动生成的函数来简化您的使用。当然,您仍然可以通过手动输入进行自定义修改。我们示例中单行和多行日志生成的时间格式如下:
至此,我们已经相应地介绍了完整正则模式的三个功能(单行/多行日志采集、提取字段、指定日志时间),并给出了在控制台中操作的示例。
最佳实践1. 如何调试正则表达式?
如果要调试日志服务控制台设置的正则表达式,可以直接使用界面上的verify按钮提供的功能进行检查:
此外,如果你想进行更多的验证甚至调试正则表达式,你可以使用Regex101、RegexTester等在线工具,将控制台自动为你生成的正则表达式复制粘贴到这些工具中,然后填写在您的实际日志中进行检查和调试。
在前面提取字段的例子中,我们提到自动生成功能为多行日志的消息字段生成了不适当的规律。这里,我们以Regex101为例来检查正则性:
首先,我们将自动生成的完整正则复制到Regex101:\[([^]]+)]\s\[(\w+)]\s([^:]+:\s\w+\s\w+\s [^:]+:\S+\s[^:]+:\S+\s\S+).*. 在界面右侧,您还可以看到规律性的含义。
然后,我们将日志样本中的日志发布到它。
匹配,但是消息字段中没有收录at之后的内容(注意颜色,橙色和蓝色),这也是我们前面说的正则表达式错误的原因之一。
那么我们来验证另一个错误:如果日志中只有两个冒号。
比赛失败。
最后,我们来看看我们之前说的用 [Ss]+ 替换最后一个正则表达式。
之后的内容:
只有两个冒号的日志:
同样,您也可以按照上述方法调试和修改您的正则表达式,最后将它们应用到控制台。
2. 日志收录多种格式怎么办?
全正则模式要求日志必须采用统一的格式,但有时日志中可能收录多种格式的日志。如何处理这种情况?
[2018-10-01T10:30:31,000] [WARNING] java.lang.Exception: another exception happened
at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
[2018-10-01T10:30:32,000] [INFO] info something
[2018-10-01T10:30:33,000] [DEBUG] key:value key2:value2
以上面的Java日志为例。作为程序日志,一般既收录正常信息,也收录一些错误信息(如异常栈等):
在这方面,有两种选择可以考虑:
3. 正则表达式的性能优化
如果你很在意采集的性能,可以花更多的时间提升正则表达式的性能。以下是一些建议供您参考:
使用更精确的字符。不要盲目使用 .* 来匹配字段。该表达式收录大量搜索空间,容易导致不匹配或降低匹配性能。例如,您要提取的字段仅由字母组成,则使用 [A-Za-z]。使用正确的量词,而不是盲目地使用 +、*。例如,如果使用\d 来匹配IP 地址,那么\d{1,3} 可能比\d+ 更划算。调试。与故障排除类似,您还可以在 Regex101 上调试在正则表达式上花费的时间。一旦发现大量回溯,及时优化。4. 时间格式配置技巧
日志服务的时间戳最多只支持秒,所以时间格式只需要配置到秒,不需要配置毫秒、微秒等信息。
前面能解析时间的部分时间字段就够了,后面就不用配置了
常见的日志格式配置示例如下:
自定义1 2017-12-11 15:05:07
%Y-%m-%d %H:%M:%S
自定义2 [2017-12-11 15:05:07.012]
[%Y-%m-%d %H:%M:%S
RFC822 02 Jan 06 15:04 MST
%d %b %y %H:%M
RFC822Z 02 Jan 06 15:04 -0700
%d %b %y %H:%M
RFC850 Monday, 02-Jan-06 15:04:05 MST
%A, %d-%b-%y %H:%M:%S
RFC1123 Mon, 02 Jan 2006 15:04:05 MST
%A, %d-%b-%y %H:%M:%S
RFC3339 2006-01-02T15:04:05Z07:00
%Y-%m-%dT%H:%M:%S
RFC3339Nano 2006-01-02T15:04:05.999999999Z07:00
%Y-%m-%dT%H:%M:%S
阅读Logtail从入门到精通(四):正则表达式Java日志采集实用Python日志采集在线正则表达式分析加入分析交流群