1、正则匹配日志状态码

正则网站

目的

先简单介绍下本文的目的,近期发现监控系统中配置了日志监控,其中有一项是监控日志的状态码,在发现状态码为5xx的时候进行报警,监控项实现分两步,第一步采集配置第二步是报警配置,采集配置中是通过一段正则匹配到状态码并将匹配到的状态码给打了一个标签,打标签的作用是为了第二步报警配置,报警配置中要通过这个标签取到相应的字段值。我对采集配置中的正则有点看不懂所以研究了下,特此写了这篇文章

以下记录下日志监控的实现,方便上下文参考
采集配置
在这里插入图片描述

报警配置
在这里插入图片描述

自己的思路和实现方法

- 日志内容

2019-02-01 18:33:41,422-[AEDA082568FD04BA]-[INFO]-[http-bio-1601-exec-23] 1|AEDA082568FD04BA|2019-02-01 18:33:40.997|127.0.0.1|720196014458|coopj1|s3.cn-east-2.jcloudcs.com|PUT.objectPart|PUT|/vod-bilibili/upgcxcode/53/51/24145153/24145153-2-64.flv|4,194,304|500|application/xml|0|0.425285|127.0.0.1|-|aws-sdk-java/1.11.290 Linux/3.10.0-327.36.4.el7.x86_64 Java_HotSpot(TM)_64-Bit_Server_VM/25.111-b14 java/1.8.0_111|-|1

正则匹配

  • [^\|]* 匹配非“|”开头的字符

思路

  1. 在日志内容中找规律,发现日志文件都已|分割,共分割了20列,本次要取到状态码,状态码所在的列是第12列,如果是shell中直接awk -F ‘|’ '{print $12}'就能取到,但本次是为了配置报警,我们不但要取到想要的列的内容,还要通过一个标签能找到这列的内容,所以按照以下步骤
  2. 先写一句正则能够匹配每列
[^\|]*\|

在这里插入图片描述
3.匹配一整段日志

[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*\|[^\|]*

在这里插入图片描述
4. 正则分组 ()
分组的作用可以将匹配到的内容都独立出来,并且可以打标签,也可以单独给要取值的字段分组

([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)

在这里插入图片描述

  1. 打标签
    (?P<标签名称>正则表达式)
([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|(?P<code>[^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)\|([^\|]*)

在这里插入图片描述


实现方法二

  • 指定列进行分组并打标签
    在这里插入图片描述
    注:打标签的前提是必须要有分组()

实现方法三

{n},n是非负整数,意思是匹配前面的字符出现n次,这里n前面的字符是一组字符,所以匹配的值前面一组11组字符,那么我们要取第12组字符,为什么这里不直接取12呢,因为我们是以|为分割符的,前面取得字符都带有|,所以我们只能先取到相邻列然后再取12列的值,这样我们想要的12列了
([^\|]*\|){11}(?P<code>\d*)

在这里插入图片描述

本人微信:yfhgbj888 忘大家多多指点互相交流