博客/工程

如何转义特殊字符与洛基的LogQL

2021年1月5日3分钟

在我的研究中洛基我已经分享了所有最好的创作技巧快速过滤器查询它可以在几秒钟内过滤tb级的数据。

在这一期中,我将揭示如何在Loki的LogQL中正确转义字符串中的特殊字符。

在编写LogQL查询时,您可能已经意识到在许多地方必须编写由双引号分隔的字符串。这适用于标签匹配器,行过滤器,regex,标签过滤器我们在很多地方使用双引号字符串。

但是,当您突然想要过滤包含双引号的行时,问题就出现了。例如,这个过滤器查询…

{namespace="loki-ops",container="query-frontend"} |= """ ""

将返回一个解析错误,因为洛基认为您没有关闭双引号字符串。

下面是另一个例子:这次让我们假设我们正在查看Windows容器。这是同样的想法,这种查询。

{namespace="dev",container="win-broker"} |= "c:\Users\test\null"

将导致一个错误,因为\ U\ t,\ n被认为是特殊字符。

所以你需要转义这些特殊字符。逃避的方法就是使用在特殊字符的前面。

{名称空间= " loki-ops ",容器= " query-frontend "} |= "\”" { 名称空间=“开发”,容器=“win-broker”}| = " c: \ \ \ \用户测试\ \空”

最后但并非最不重要的是,在执行正则表达式时,甚至还有更多特殊字符(+?等等)。例如,如果你想匹配一个数字\ d或者一个点,您还需要转义这些。

所以如果你想提取IP地址,查询将是这样的:

{名称空间= " grafana-com ",容器=“nginx”}| = " / observabilitycon " ! = "资产" | regexp”(? P < ipaddress > \ \ d {1,3} \ \ \ \ d {1,3} \ \ \ \ d {1,3} \ \ \ \ d{1,3})。”

那是很多-s,很容易混淆。

但好消息是:在《洛基》中有一种更酷的方法!你可以使用我们所说的原始字符串,它不需要转义.原始字符串是反引号(' ' ')字符串。

上面的三个例子使用原始字符串要简单得多:

{名称空间= " loki-ops ",容器= " query-frontend "} |= `"` { 名称空间=“开发”,容器=“win-broker”}| = c: \ \测试用户\ null的{名称空间=“grafana-com”,容器=“nginx”}| = " / observabilitycon " ! = "资产" | regexp”(? P < ipaddress > \ d {1,3} \ \ d{1,3} \。。\ d {1,3} \ \ d{1,3})。”

使用原始字符串的唯一问题是,如果你确实需要转义一个字符,比如反撇号(' ' '),因为它标志着原始字符串的结束和开始,你不能这样做!在这种情况下,你需要使用字符串。

我希望这能消除LogQL中关于转义字符的任何困惑。原始字符串使用起来超级简单,在编写正则表达式时应该优先使用。一定要读完全文LogQL文档欲知详情。

如果你感兴趣,你可以自己安装洛基或者在几分钟内开始对付洛基Grafana云.我们刚刚宣布了新的免费和付费Grafana云计划,以适应每一个用例-现在免费注册