适用于日志文件中多个匹配项的regex-expr,以创建警报



我有一个日志,如果连续出现5个或多个非200 http错误代码,我需要能够从中生成警报。例如,如果我得到两个499代码,两个501,一个404,一个接一个(在日志中的多个单行上(,我需要表达式来查看这些行,确定代码至少弹出了5次,并提供结果。

我现在的匹配表达式似乎找到了非200的东西,但我认为由于它的编写方式,如果日志中只有499个错误代码,该工具会发出警报。以下是表达式:/(bacsvcs/(.*?([013-9]{1}\d{2}|2[1-9][1-9]|2\d[1-9]|2[1-90]\d(\d{1}/

这是一个日志示例。。。如果您将其复制/粘贴到记事本,则可能更容易查看。

10.170.32.12 - - [20/Oct/2019:05:32:57 -0500] "POST /bacsvcs/pridemarkLookupService HTTP/1.1" 200 171096 "-" "-" "35.182.104.198""BACRequestId = New Relic Monitor""APIMGER_Server = 10.170.42.177:8280""RESPOSE_TIME = 0.277" "."

10.170.32.12-[21/2019年10月21日9:05:32:58-0500]"POST/bacsvcs/historySumaryService HTTP/1.1"200 663"-"订单检查/美国银行"171.159.192.10"BACRequestId=GdUbL6dGrkwABHxVApgAAAFD"APIMGER_Server=10.170.42.178:8280"RESPOSE_TIME=0.085""10.170.32.12-[20/Oct/2019:05:32:57-0500]"POST/bacsvcs/pridemarkLookupService HTTP/1.1"200 171096"-"35.182.104.198"BACRequestId=新遗迹监视器"APIMGER_Server=10.170.42.177:8280"RESPOSE_TIME=0.277""10.170.32.12-[21/2019年10月21日9:05:32:58-0500]"POST/bacsvcs/historySumaryService HTTP/1.1"499 663"-"订单检查/美国银行"171.159.192.10"BACRequestId=GdUbL6dGrkwABHxVApgAAAFD"APIMGER_Server=10.170.42.178:8280"RESPOSE_TIME=0.085""10.170.32.12-[20/Oct/2019:05:32:57-0500]"POST/bacsvcs/pridemarkLookupService HTTP/1.1"501 171096"-"35.182.104.198"BACRequestId=新遗迹监视器"APIMGER_Server=10.170.42.177:8280"RESPOSE_TIME=0.277"。"10.170.32.12-[21/2019年10月21日9:05:32:58-0500]"POST/bacsvcs/historySumaryService HTTP/1.1"404 663"-"订单检查/美国银行"171.159.192.10"BACRequestId=GdUbL6dGrkwABHxVApgAAAFD"APIMGER_Server=10.170.42.178:8280"RESPOSE_TIME=0.085""10.170.32.12-[20/Oct/2019:05:32:57-0500]"POST/bacsvcs/pridemarkLookupService HTTP/1.1"499 171096"-"-"35.182.104.198"BACRequestId=新的Relic Monitor"APIMGER_Server=10.170.42.177:8280"RESPOSE_TIME=0.277"。"10.170.32.12-[21年10月21日9:05:32:58-0500]"POST/bacsvcs/historySumaryService HTTP/1.1"501 663"-"订单检查/美国银行"171.159.192.10"BACRequestId=GdUbL6dGrkwABHxVApgAAAFD"APIMGER_Server=10.170.42.178:8280"RESPOSE_TIME=0.085"。">

如果你想匹配非200码,你可以使用[13-9]d{2}来匹配从100到999的数字,除了200到299的

我假设您的日志文件中的空间数是一致的。如果是这样的话,您可以使用量词重复多次匹配非空白字符,然后使用空白字符来获取状态代码的部分并进行匹配。

要匹配5次或5次以上,可以匹配第一部分,然后重复4次或4次以上。

^(?:S+s+){6}/bacsvcs/(?:S+s+){2}([13-9]d{2} d).*(?:r?n(?:S+s+){6}/bacsvcs/(?:S+s+){2}1.*){4,}
  • ^字符串开始
  • (?:S+s+){6}重复6次匹配1+个非空白字符,后跟1+个空白字符
  • /bacsvcs/按字面匹配
  • (?:S+s+){2}重复2次匹配1+个非空白字符,后跟1+个空白字符
  • ([13-9]d{2} d)捕获组1,匹配号码100-999,200-299除外
  • .*匹配除换行符以外的任何字符0+次
  • (?:非捕获组
    • r?n匹配换行符
    • (?:S+s+){6}/bacsvcs/(?:S+s+){2}1.*匹配与以前相同的模式,并使用反向参考1来参考第一行中捕获的相同数字
  • ){4,}关闭组并重复4次或更多次

查看regex演示

不使用回溯参考,您可以使用:

^(?:S+s+){6}/bacsvcs/(?:S+s+){2}[13-9]d{2} d.*(?:r?n(?:S+s+){6}/bacsvcs/(?:S+s+){2}[13-9]d{2}.*){4,}

Regex演示

相关内容

  • 没有找到相关文章