
Loki 如何在 LogQL 中精确匹配 IPv4 与 IPv6 地址及其网段范围【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki在 Loki 中按 IP 地址筛选日志时直接对日志行做字符串匹配会遇到两个问题| 3.180.71.3这样的行过滤同时命中93.180.71.3这类前缀相同的地址而改用正则|~^3.180.71.3后又无法处理 IPv6 地址也不能匹配 IP 范围。LogQL 的ip(pattern)表达式解决的就是这个任务对单条 IPv4/IPv6 地址、地址区间和 CIDR 网段做精确匹配。该能力从 Loki 2.3 开始提供见 V2.3 发布说明可用在行过滤表达式和标签过滤表达式中。先确认为什么普通的行过滤不够文档给出的日志示例如下文档示例3.180.71.3 - - [17/May/2015:08:05:32 0000] GET /downloads/product_1 HTTP/1.1 304 0 - Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21) 80.91.33.133 - - [17/May/2015:08:05:14 0000] GET /downloads/product_1 HTTP/1.1 304 0 - Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16) 46.4.66.76 - - [17/May/2015:08:05:45 0000] GET /downloads/product_1 HTTP/1.1 404 318 - Debian APT-HTTP/1.3 (1.0.1ubuntu2) 93.180.71.3 - - [17/May/2015:08:05:26 0000] GET /downloads/product_1 HTTP/1.1 404 324 - Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)用行过滤{job_namemyapp} | 3.180.71.3查询第四行的93.180.71.3也会被匹配。改用正则|~^3.180.71.3可以避免前缀误匹配但正则不处理 IPv6也无法表达“一个网段内的所有地址”。这就是需要ip()表达式的原因。使用 ip() 表达式的三种匹配模式匹配 IP 地址的语法是ip(pattern)其中pattern支持三种形式均为文档中的示例值单个 IP 地址同时支持 IPv4 和 IPv6ip(192.0.2.0)、ip(::1)IP 地址区间用-连接起止地址ip(192.168.0.1-192.189.10.12)、ip(2001:db8::1-2001:db8::8)CIDR 网段ip(192.51.100.0/24)、ip(2001:db8::/32)使用限制行过滤表达式中只能配合|和!使用标签过滤表达式中只能配合和!使用。行过滤表达式中的 IP 匹配匹配 IPv4 网段内的日志行{job_namemyapp} | ip(192.168.4.5/16)排除某个 IPv4 区间返回不在该范围内的日志行{job_namemyapp} ! ip(192.168.4.5-192.168.4.20)验证方式就是执行查询并核对结果|版本应只返回落在网段内的行!版本应只返回范围外的行。对照文档示例日志检查最直观——例如用| 3.180.71.3会误匹配93.180.71.3而换成ip()精确匹配后就不会。标签过滤表达式中的 IP 匹配当 IP 出现在结构化字段里如访问日志的remote_addr先用解析表达式如logfmt把字段提取成标签再用ip()做标签过滤按 IPv6 区间过滤文档示例{job_namemyapp} | logfmt | remote_addr ip(2001:db8::1-2001:db8::8) | level error标签过滤器可以链式组合。下面这个示例匹配192.168.4.5/16网段内、但不包括192.168.4.2的日志行{job_namemyapp} | logfmt | addr ip(192.168.4.5/16) | addr ! ip(192.168.4.2)也可以用条件or匹配多个网段中的任意一个例如命中192.168.4.0/24或10.10.15.0/24文档示例{job_namemyapp} | logfmt | addr ip(192.168.4.0/24) or addr ip(10.10.15.0/24)更多组合写法可参考 Query examples 中的 “Examples that filter on IP address” 一节。注意标签带error的行会被 ip() 保留无论使用哪种操作符ip()标签过滤器都会保留已经带有__error__标签的日志行。如果只想看到成功解析并匹配的行需要在管道中额外加一个__error__过滤把这些行排除掉管道错误的处理见 Log queries 的 pipeline errors 部分。另外Upgrade Loki 的未发布变更说明中提到新版本中| __error__ ip(1.2.3.4)这类针对__error__/__error_details__的ip()比较会解析失败这两个标签只保存字符串IP 比较永远不会命中应改用字符串比较例如| __error__ ! 。适用条件小结版本Loki 2.3 及以上可用位置行过滤表达式|、!和标签过滤表达式、!匹配范围IPv4/IPv6 单地址、地址区间、CIDR 网段完整语法与更多示例见 Matching IP addresses。【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考