我有一个日志,如果连续出现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演示