匹配 IP 地址
LogQL 支持匹配 IP 地址。
对于以下日志:
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)"
LogQL 行过滤器是不够的。例如,行过滤器
{job_name="myapp"} |= "3.180.71.3"
也会匹配示例 IP 地址,例如 93.180.71.3。更好的选择是使用正则表达式:|~"^3.180.71.3"
。这个正则表达式不能处理 IPv6 地址,并且它不能匹配 IP 地址范围。
LogQL 对匹配 IP 地址的支持涵盖了 IPv4 和 IPv6 单个地址,以及 IP 地址范围和 CIDR 模式。
使用以下语法匹配 IP 地址:ip("<pattern>")
。<pattern>
可以是
- 单个 IP 地址。示例:
ip("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 匹配既可用于行过滤器表达式,也可用于标签过滤器表达式。指定行过滤器表达式时,只允许使用 |=
和 !=
操作。指定标签过滤器表达式时,只允许使用 =
和 !=
操作。
行过滤器示例
{job_name="myapp"} |= ip("192.168.4.5/16")
返回与 IPv4 范围不匹配的日志行
{job_name="myapp"} != ip("192.168.4.5-192.168.4.20")
标签过滤器示例
{job_name="myapp"} | logfmt | remote_addr = ip("2001:db8::1-2001:db8::8") | level = "error"
过滤器也可以串联使用。此示例匹配 IPv4 子网值
192.168.4.5/16
中的所有日志行,但排除 IP 地址192.168.4.2
{job_name="myapp"} | logfmt | addr = ip("192.168.4.5/16") | addr != ip("192.168.4.2")
此示例使用条件
or
,匹配 IPv4 子网值192.168.4.0/24
或 IPv4 子网值10.10.15.0/24
中的所有日志行{job_name="myapp"} | logfmt | addr = ip("192.168.4.0/24") or addr = ip("10.10.15.0/24")