多行日志合并处理的内外存方法

本文介绍如何使用SPL处理不定行日志,特别是那些由多个连续行构成一条完整记录的日志。通过SPL的分组功能,如A.group@i(exp),可以有效地识别并组合这些日志行。示例中展示了脚本如何过滤、分组和结构化日志,以减少内存占用,并探讨了使用游标进一步优化处理的方法。
摘要由CSDN通过智能技术生成

上一讲中,我们介绍了如何用SPL将一行日志结构化为一条记录,今天则要说一下多行日志对应一条记录的情况,我们称之为不定行日志。

 

事实上,集算器自己的输出日志就是这种不定行日志,我们来看一下集算器节点机下的一个日志文件rqlog. log,同样摘录两段日志:

[2018-05-14 09:20:20]

DEBUG: 临时文件过期时间为:12小时。

 

[2018-05-14 09:20:20]

DEBUG: Temporary file directory is:

D:\temp\esProc\nodes\127.0.0.1_8281\temp.

Files in temporary directory will be deleted on every 12 hours.

简单分析一下这两段日志,每一段第一行都是方括号中的时间,紧接着第二行是用冒号分隔的日志类型和日志内容,随后各行都是日志内容的补充,直至遇到下一个方括号中的时间行。由此可以确定,结构化后的字段应该有三个:日志时间日志类型日志内容

对于这种不定行的日志,最直接的结构化思路就是逐行加载,并根据条件拼接成相应的字段。但这里有个麻烦,由于每条记录对应的行数不确定,所以需要另外通过条件判断来识别每条记录的起始行。另一个问题就是当使用游标分析比较大的文件时,由于每次fetch的行数不可能总是刚好断在一条记录的末尾,所以在fetch的块与块之间还要考虑衔接问题。

所以,对于这种类型的日志,最理想的方法,是应该能把每一块日志与其它块自动分开。这样,就可以直接将每一块日志解析到一条记录,而不需要考虑读取的行应该属于上一条记录还是下一条记录。

SPL中就有这样的分组方式,形如A.group@i(exp),只不过其中的分组表达式exp不能返回枚举值,而应该返回布尔值。而i选项则表示根据相邻行计算exp,如果返回true就表示建立一个新组,其后面连续返回false的行都归于这个组。

有了这样的分组方式,我们只要写出能解析记录第一行的exp就可以了。本例中,记录第一行是以方括号“[”开始的一个日期时间,如果能够确定后面的内容中不会有以“[”开始的行,那么分组表达式只需判断每一行的第一个字符是否为‘[’就可以了。

下面是实现的脚本文件convertlog.dfx:

 

A

B

C

D

1

=create(日志时间, 日志类型, 日志内容 )

=now()

   

2

=file@s(fileName:"UTF-8")

=A2.read@n()

=B2.select(~!="")</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值