我正在尝试设置日志条目服务。如果日志条目中包含令牌,那么我想将其发送到 api.logentries.com:10000。令牌是格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee 的 guid。
我现在正在做的事情:
# If there's a logentries token then send it directly to logentries
:msg, regex, ".*[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.*"
& @@api.logentries.com:10000
我检查了 rsyslog 调试日志,我的正则表达式不匹配,但我不知道为什么或如何修复它:
5245.961161378:7fb79b514700: Filter: check for property 'msg' (value ' fb1c507f-2ede-4d7f-a140-2bd8d56e133 - application - [play-akka.actor.default-dispatcher-1] - Found user: 4fb11ea5e4b00a1aeebe2800') regex '.*[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}.*': FALSE
答案1
Rsyslog 支持 POSIX BRE 和 ERE 语法。这两种语法在当今都有些不常见。不过,两者之间的一个区别是,字符{
和}
需要在 BRE 中进行转义 - 这也是使用这些模板时 rsyslogs 的默认语法。
看: https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions和http://www.regular-expressions.info/posix.html
此外,与 PCRE 相比:
- BRE/ERE 总是贪婪的;没有非贪婪标志
.*?
- 没有非分组组(在 Rsyslog 中):
(?: ... )
- 在 ERE 中,零或多个(
x?
)必须写为:x{0,1}
在 ERE 模式下,此字符串
fb1c507f-2ede-4d7f-a140-2bd8d56e133
的匹配方式如下:
([[:alnum:]]{8}(-[[:alnum:]]{4}){3}-[[:alnum:]]{11})
答案2
rsyslog 是一堆垃圾,它不接受正则表达式中的花括号,而文档中完全没有提到这一点。因此,以下正则表达式:
[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}
需要重写为:
[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]-[a-z0-9][a-z0-9][a-z0-9][a-z0-9]-[a-z0-9][a-z0-9][a-z0-9][a-z0-9]-[a-z0-9][a-z0-9][a-z0-9][a-z0-9]-[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]
答案3
$msg , regex, yourRegEx @api.logentries.com:10000 // 过滤并发送 & ~ // 丢弃与规则匹配的内容 $template myTemplate,“TOKEN %msg%” *.* @api.logentries.com:10000?myTemplate
我还没有测试过……但应该是这样的