菜单
文档breadcrumb arrow Grafana Lokibreadcrumb arrow 查询breadcrumb arrow 匹配 IP 地址
开源

匹配 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 行过滤器是不够的。例如,行过滤器

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 匹配既可用于行过滤器表达式,也可用于标签过滤器表达式。指定行过滤器表达式时,只允许使用 |=!= 操作。指定标签过滤器表达式时,只允许使用 =!= 操作。

  • 行过滤器示例

    logql
    {job_name="myapp"} |= ip("192.168.4.5/16")

    返回与 IPv4 范围不匹配的日志行

    logql
    {job_name="myapp"} != ip("192.168.4.5-192.168.4.20")
  • 标签过滤器示例

    logql
    {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

    logql
    {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 中的所有日志行

    logql
    {job_name="myapp"}
    	| logfmt
    	| addr = ip("192.168.4.0/24") or addr = ip("10.10.15.0/24")