我有一个日志,如果连续出现5个或更多非200http错误代码,我需要能够生成警报。例如,如果我得到两个499代码,两个501,一个404 (在日志中的多个单行上),我需要表达式来查看这些行,确定代码至少弹出了5次,并提供结果。
我现在拥有的匹配表达式似乎找到了非200的值,但我认为由于它的编写方式,如果log.Here中只有499个错误代码,该工具将发出警报: /(bacsvcs/).*?(013-9{1}\d{2}|21-9|2\d1-9|21-9\d) \d{1}/
这是一个示例log...it,如果您将其复制/粘贴到记事本,可能会更容易查看。
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/Oct/2019:05:32:58 -0500 "POST /bacsvcs/historySummaryService HTTP/1.1“200663 "-”“订单检查/美国银行”"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/Oct/2019:05:32:58 -0500 "POST /bacsvcs/historySummaryService 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/Oct/2019:05:32:58 -0500 "POST /bacsvcs/historySummaryService HTTP/1.1”404663 "-“”订单检查/美国银行“"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 =新遗迹监视器”“APIMGER_Server= 10.170.42.177:8280""RESPOSE_TIME = 0.277”".“10.170.32.12 -- 21/Oct/2019:05:32:58 -0500 "POST /bacsvcs/historySummaryService HTTP/1.1”“501663 "-”“订单检查/美国银行”"171.159.192。10""BACRequestId = GdUbL6dGrkwABHxVApgAAAFD""APIMGER_Server = 10.170.42.178:8280""RESPOSE_TIME = 0.085“”。“
发布于 2019-10-26 02:08:13
如果要匹配非200代码,可以使用[13-9]\d{2}来匹配除200到299之外的100到999之间的数字
我假设您的日志文件中的空格数量是一致的。如果是这样的话,您可以使用quantifiers多次重复匹配非空格字符,然后重复匹配空格字符,以获得状态代码的一部分并进行匹配。
要匹配5次或更多次,您可以匹配第一部分并重复4次或更多次。
^(?:\S+\s+){6}/bacsvcs/(?:\S+\s+){2}([13-9]\d{2} \d).*(?:\r?\n(?:\S+\s+){6}/bacsvcs/(?:\S+\s+){2}\1.*){4,}^开始string(?:\S+\s+){6}重复6次匹配1+非空格字符,然后是1+空格chars([13-9]\d{2} \d)捕获组1,重复2次匹配1+非空格字符,然后是1+空格捕获组1,匹配除200-299.*以外的数字100-999与除newline(?:非捕获组\r?\n以外的任何字符匹配newline(?:\S+\s+){6}/bacsvcs/(?:\S+\s+){2}\1.*匹配与前面相同的模式,并使用line0+引用在第一个backreference中捕获的相同数字
){4,}关闭组并重复4次或更多次
不使用反向引用,您可以使用:
^(?:\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,}https://stackoverflow.com/questions/58550106
复制相似问题