我使用telegraf和logparser插件将apache日志导入Influxdb
我想从机器人中过滤掉所有日志,因此我设置了一个自定义模式,其中的正则表达式只匹配不包含单词“bot”和“crawl”的用户代理:
NOBOT ((?!bot|crawl).)*
CUSTOM_LOG_FORMAT %{CLIENT:client_ip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:ts:ts-httpd}\] "(?:%{WORD:verb:tag} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version:float})?|%{DATA})" %{NUMBER:resp_code:tag} (?:%{NUMBER:resp_bytes:int}|-) %{QS:referrer} "%{NOBOT:agent}"
但它不起作用,零指标正被导入到Influxdb
正则表达式似乎没问题,当我在这里测试它时它工作正常:http://grokconstructor.appspot.com/do/match
为了确保我尝试了一个更简单的正则表达式:
BOT .*?bot.*?
CUSTOM_LOG_FORMAT %{CLIENT:client_ip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:ts:ts-httpd}\] "(?:%{WORD:verb:tag} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version:float})?|%{DATA})" %{NUMBER:resp_code:tag} (?:%{NUMBER:resp_bytes:int}|-) %{QS:referrer} "%{BOT:agent}"
它有效,telegraf只从机器人导入日志,但我想要相反,我没有看到((?!bot|crawl).)*
答案 0 :(得分:0)
我不确定您为什么没有收到错误消息,但不幸的是Go并不支持负面预测:
https://play.golang.org/p/Kq5N2FgG6_
Hello, playground
panic: regexp: Compile(`((?!bot|crawl).)*`): error parsing regexp: invalid or unsupported Perl syntax: `(?!`
goroutine 1 [running]:
panic(0x133400, 0x1050a140)
/usr/local/go/src/runtime/panic.go:500 +0x720
regexp.MustCompile(0x149f1b, 0x11, 0x1, 0xb)
/usr/local/go/src/regexp/regexp.go:237 +0x1a0
main.main()
/tmp/sandbox426143344/main.go:10 +0xe0
我建议在github repo上打开一个问题,以便在这些情况下返回错误消息。
至于你正在尝试做的比赛,这可能会有所帮助:Negative Look Ahead Go regular expressions