相关文章推荐
IP解析函数

IP解析函数

本文介绍 IP 解析函数的语法规则,包括参数解释、函数示例等。

函数列表

函数

说明

geo_parse

根据 IP 地址解析出所属国家、省份和市信息。

ip_cidrmatch

判断 IP 地址是否属于 CIDR 地址块。

ip_version

判断 IP 地址为 IPv4 还是 IPv6。

ip_type

判断 IP 地址为私有地址还是公有地址。

ip_makenet

将单个 IP 地址转换为 CIDR 地址块。

ip_to_format

将输入的 CIDR 地址块按照 Prefixlen 或者 Netmask 格式输出。

ip_overlaps

判断两个网段是否存在重叠。

ip2long

将字符串格式的 IP 地址转换成长整型数据。

long2ip

将长整型数据转换成字符串格式的 IP 地址。

geo_parse

根据 IP 地址解析出所属国家、省份和市信息。

  • 函数格式

    geo_parse(ip, ip_db="SLS-GeoIP", keep_fields=None, provider="ipip", ip_sep=None)
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    ip

    String

    IP 地址,表示解析该 IP 地址所属国家、省分和市信息。如果包含多个 IP 地址,可通过 ip_sep 参数指定分割符。

    ip_db

    String

    解析 IP 地址所属国家、省份和市信息所使用的 IP 地址库。

    • SLS-GeoIP:SLS 内置 IP 库,取值为 SLS-GeoIP,默认使用该选项。为保证精确度,SLS 内置 IP 库每天更新一次,使用时无需额外配置。

    • 自选 IP 库:使用 res_oss_file(endpoint, ak_id, ak_key, bucket, file, format='text', change_detect_interval=0,fetch_interval=2,refresh_retry_max=60,encoding='utf8',error='ignore') ,参数定义请参见 res_oss_file

    keep_fields

    Tuple

    返回结果中包含的 key 信息。

    • 当通过 SLS 内置 IP 库解析时,默认返回信息如下:

      • city:城市名称。

      • province:省份名称。

      • country:国家名称。

      • city_en:城市的行政区划代码或者英文名称。

      • province_en:省份的行政区划代码或者英文名称。

      • country_en:国家或地区的代码或者英文名称。

      • isp:所属网络运营商名称。

      • lat:IP 地址所在位置的纬度。

      • lon:IP 地址所在位置的经度。

    • 当通过自选 IP 库解析时,默认返回信息如下:

      • city:城市名称。

      • province:省份名称。

      • country:国家名称。

    例如 keep_fields=("city","country") 表示仅输出 city country 字段信息。

    此外 keep_fields 也支持重命名。例如 (("city","cty"),("country","state")) 表示以 cty state 形式输出。

    provider

    String

    仅当 ip_db 取值为 自选 IP 时,该参数有效。取值如下:

    • ipip:默认值。使用 ipdb 库提供的二进制 IP 地址库,下载地址为 ipip

    • ip2location:使用全球 IP 二进制解析库,下载地址为 ip2location 。仅支持二进制包。

    ip_sep

    String

    IP 地址分隔符,用于将包含多个 IP 地址的字符串分割为多个 IP 地址,解析结果通过 JSON 格式返回。默认值为 None,表示不进行分隔。

  • 返回结果

    返回字典形式数据,包含如下内容:

    {
      "city": "...",
      "province":"...",
      "country": "..."
    }
  • 函数示例

    • 示例 1:使用 SLS 内置 IP 库查询。

      • 原始日志

        ip : 203.0.113.1
      • 加工规则

        e_set("geo", geo_parse(v("ip")))
      • 加工结果

        ip : 203.0.113.1
        geo: {"city":"杭州","province":"浙江省","country":"中国","isp":"移动","lat":30.16,"lon":120.12}
    • 示例 2:使用 SLS 内置 IP 库查询,解析包含多个 IP 地址的日志字段,并返回每个 IP 地址所属的国家、省份和市信息。

      • 原始日志

        ip : 203.0.113.4, 192.0.2.2, 198.51.100.2
      • 加工规则

        e_set("geo", geo_parse(v("ip"), ip_sep=","))
      • 加工结果

        ip : 203.0.113.4, 192.0.2.2, 198.51.100.2
        geo : {"203.0.113.4": {"country_en": "CN", "province_en": "330000", "city_en": "330200", "country": "中国", "province": "浙江省", "city": "宁波市", "isp": "电信", "lat": 29.8782, "lon": 121.549}, "192.0.2.2": {"country_en": "CN", "province_en": "320000", "city_en": "321300", "country": "中国", "province": "江苏省", "city": "宿迁市", "isp": "电信", "lat": 33.9492, "lon": 118.296}, "198.51.100.2": {"country_en": "CN", "province_en": "330000", "city_en": "330500", "country": "中国", "province": "浙江省", "city": "湖州市", "isp": "电信", "lat": 30.8703, "lon": 120.093}}
    • 示例 3:使用自选 IP 库查询。

      • 原始日志

        ip : 203.0.113.1
      • 加工规则

        e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                         ak_id='your ak_id',
                                                         ak_key='your ak_key',
                                                         bucket='your bucket', file='ipipfree.ipdb',
                                                                       format='binary',change_detect_interval=20)))
      • 加工结果

        ip : 203.0.113.1
        geo : {"city": "杭州", "province":"浙江省","country": "中国"}
    • 示例 4: 使用自选 IP 库查询,选择输出关键 key 字段信息并且重命名 key 字段名称。

      • 原始日志

        ip : 203.0.113.1
      • 加工规则

        e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                         ak_id='your ak_id',
                                                         ak_key='your ak_key',
                                                         bucket='your bucket', file='ipipfree.ipdb',
                                                                       format='binary',change_detect_interval=20),keep_fields=(("city","cty"),("country","state"),("province","pro"))))
      • 加工结果

        ip : 203.0.113.1
        geo : { "state": "中国","pro": "浙江省","cty": "杭州"}
    • 示例 5:使用自选 IP 库查询,选择输出关键 key 字段信息。

      • 原始日志

        ip : 203.0.113.1
      • 加工规则

        e_set("geo",geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                         ak_id='your ak_id',
                                                         ak_key='your ak_key',
                                                         bucket='your bucket', file='ipipfree.ipdb',
                                                                       format='binary',change_detect_interval=20),keep_fields=("country","province")))
      • 加工结果

        ip : 203.0.113.1
        geo : { "country": "中国","province": "浙江省"}
    • 示例 6:使用自选 IP 库查询,使用 ip2location 全球 IP 解析库输出关键 key 字段信息 。

      • 原始日志

        ip : 203.0.113.2
      • 加工规则

        e_set("geo", geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',ak_id="your ak_id", ak_key="your ak_secret", bucket='log-etl-staging', file='your ip2location bin file', format='binary', change_detect_interval=20),provider="ip2location"))
      • 加工结果

        ip : 203.0.113.2
        geo : {"city":"Dearborn","province":"Michigan","country":"United States"}

      数据加工使用的是 ip2location 的开源 Python SDK。ip2location Python SDK 支持解析的字段如下所示,数据加工同步支持解析如下所有字段。如果您在使用过程中发现无法解析出目标字段,请检查使用的 ip2location 解析库是否包含目标字段。

      country_short
      country_long /  数据加工使用country字段替代
      region  / 数据加工使用province字段替代
      latitude
      longitude
      domain
      zipcode
      timezone
      netspeed
      idd_code
      area_code
      weather_code
      weather_name
      mobile_brand
      elevation
      usage_type                               

      更多信息,请参见 ip2location Python SDK

    • 示例 7:使用自选 IP 库查询,解析包含多个 IP 地址的日志字段,并返回每个 IP 地址所属的国家省市信息。

      • 原始日志

        ip : 203.0.113.3, 192.0.2.1, 198.51.100.1
      • 加工规则

        e_set("geo", geo_parse(v("ip"), ip_db=res_oss_file(endpoint='http://oss-cn-hangzhou.aliyuncs.com',
                                                                       ak_id="ak_id",
                                                                       ak_key="ak_secret",
                                                                       bucket='log-etl-staging',
                                                                       file='calendar.csv/IP2LOCATION-LITE-DB3.BIN',
                                                                       format='binary', change_detect_interval=20),
                                        provider="ip2location", ip_sep=","))
      • 加工结果

        ip : 203.0.113.3, 192.0.2.1, 198.51.100.1
        geo : {"203.0.113.3": {"city": "Dearborn", "province": "Michigan", "country": "United States"}, "192.0.2.1": {"city": "Hangzhou", "province": "Zhejiang", "country": "China"}, "198.51.100.1": {"city": "Hangzhou", "province": "Zhejiang", "country": "China"}}

ip_cidrmatch

根据 IP 地址是否与 CIDR 子网匹配返回布尔值。使用此函数来确定 IP 地址是否属于 CIDR 地址块。当 IP 地址属于 CIDR 地址块时,返回 True,否则返回 False。支持 IPv4 IPv6。

  • 函数格式

    ip_cidrmatch(cidr_subnet, ip,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    cidr_subnet

    String

    输入 CIDR 地址块,例如:192.168.1.0/24。

    ip

    String

    输入 IP 地址。

    default

    String

    设置 default 值(可为空),如果 IP 地址与 CIDR 地址块无法匹配时,返回该值。

  • 返回结果

    如果 IP 地址与 CIDR 地址块匹配,返回 True,否则返回 False。

  • 函数示例

    • 示例 1:IP 地址(IPv4)与 CIDR 地址块匹配,返回 true。

      • 原始日志

        cidr_subnet: 192.168.1.0/24
        ip: 192.168.1.100
      • 加工规则

        e_set("is_belong",ip_cidrmatch(v("cidr_subnet"),v("ip")))
      • 加工结果

        cidr_subnet: 192.168.1.0/24
        ip: 192.168.1.100
        is_belong: true
    • 示例 2:IP 地址(IPv4)与 CIDR 地址块不匹配,返回 false。

      • 原始日志

        cidr_subnet: 192.168.1.0/24
        ip: 10.10.1.100
      • 加工规则

        e_set("is_belong",ip_cidrmatch(v("cidr_subnet"),v("ip")))
      • 加工结果

        cidr_subnet: 192.168.1.0/24
        ip: 10.10.1.100
        is_belong: false
    • 示例 3:IP 地址与 CIDR 地址块无法匹配,返回 unknown。

      • 原始日志

        cidr_subnet: 192.168.1.0/24
        ip: a
      • 加工规则

        e_set("is_belong",ip_cidrmatch(v("cidr_subnet"),v("ip"),default="unknown"))
      • 加工结果

        cidr_subnet: 192.168.1.0/24
        ip: a
        is_belong: unknown

ip_version

判断 IP 地址为 IPv4 还是 IPv6。若是 IPv4 类型 IP 地址,则返回 IPv4,若是 IPv6 类型 IP 地址,则返回 IPv6。

  • 函数格式

    ip_version(ip,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    ip

    String

    输入 IP 地址。

    default

    String

    设置 default 值(可为空),无法判断 IP 地址版本时,返回该值。

  • 返回结果

    返回 IPv4 或者 IPv6。

  • 函数示例

    • 示例 1:判断 IPv4 地址的版本,返回 IPv4。

      • 原始日志

        ip: 192.168.1.100
      • 加工规则

        e_set("version",ip_version(v("ip")))
      • 加工结果

        ip: 192.168.1.100
        version: IPv4
    • 示例 2:判断 IPv6 地址的版本,返回 IPv6。

      • 原始日志

        ip: ::1
      • 加工规则

        e_set("version",ip_version(v("ip")))
      • 加工结果

        ip: ::1
        version: IPv6

ip_type

判断 IP 地址是私有地址还是公有地址,返回 IP 类型包括 private、reserved、loopback、public allocated ripe ncc 等。

  • 函数格式

    ip_type(ip,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    ip

    String

    输入 IP 地址。

    default

    String

    设置 default 值(可为空),无法判断 IP 地址类型时,返回该值。

  • 返回结果

    返回 IP 类型包括 private、reserved、loopback、public allocated ripe ncc 等。

  • 函数示例

    • 示例 1: 判断 IP 地址,返回 loopback。

      • 原始日志

        ip: 127.0.0.1
      • 加工规则

        e_set("type",ip_type(v("ip")))
      • 加工结果

        ip: 127.0.0.1
        type: loopback
    • 示例 2: 判断 IP 地址,返回 private。

      • 原始日志

        ip: 47.100.XX.XX
      • 加工规则

        e_set("type",ip_type(v("ip")))
      • 加工结果

        ip: 47.100.XX.XX
        type: private
    • 示例 3: 判断 IP 地址,返回 public。

      • 原始日志

        ip: 47.100.XX.XX
      • 加工规则

        e_set("type",ip_type(v("ip")))
      • 加工结果

        ip: 47.100.XX.XX
        type: public
    • 示例 4: 判断 IPv6 地址,返回 loopback。

      • 原始日志

        ip: ::1
      • 加工规则

        e_set("type",ip_type(v("ip")))
      • 加工结果

        ip: ::1
        type: loopback
    • 示例 5:判断 IPv6 地址,返回 allocated ripe ncc。

      • 原始日志

        ip: 2001:0658:022a:cafe:0200::1
      • 加工规则

        e_set("type",ip_type(v("ip")))
      • 加工结果

        ip: 2001:0658:022a:cafe:0200::1
        type: allocated ripe ncc

ip_makenet

将单个 IP 地址转换为 CIDR 地址块。

  • 函数格式

    ip_makenet(ip, subnet_mask=None,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    ip

    String

    输入 IP 地址。

    subnet_mask

    String

    输入子网掩码,例如:255.255.255.0。

    说明

    如果 ip 中输入的是 IP 网段,则子网掩码可以为空。

    default

    String

    设置 default 的值(可为空),无法将 IP 地址转成 CIDR 地址块时,返回该值。

  • 返回结果

    返回 CIDR 地址块。

  • 函数示例

    • 示例 1: 将 IP 地址转换为 CIDR 地址块。

      • 原始日志

        ip: 192.168.1.0
      • 加工规则

        e_set("makenet",ip_makenet(v("ip"),"255.255.255.0"))
      • 加工结果

        ip: 192.168.1.0
        makenet: 192.168.1.0/24
    • 示例 2:将 IP 地址范围转换为 CIDR 地址块。

      • 原始日志

        ip: 192.168.1.0-192.168.1.255
      • 加工规则

        e_set("makenet",ip_makenet(v("ip")))
      • 加工结果

        ip: 192.168.1.0-192.168.1.255
        makenet: 192.168.1.0/24
    • 示例 3:将 IP 地址范围转换为 CIDR 地址块。

      • 原始日志

        ip: 192.168.1.0/255.255.255.0
      • 加工规则

        e_set("makenet",ip_makenet(v("ip")))
      • 加工结果

        ip: 192.168.1.0/255.255.255.0
        makenet: 192.168.1.0/24

ip_to_format

将输入的 CIDR 地址块按照 Prefixlen 或者 Netmask 格式输出。

  • 函数格式

    ip_to_format(cidr_subnet, want_prefix_len=0,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    cidr_subnet

    String

    输入 CIDR 地址块,例如:192.168.1.0/24

    want_prefix_len

    Int

    设置返回格式,默认为 0。

    • 0:无格式返回。

    • 1:按照 prefix 格式返回。

    • 2:按照 netmask 格式返回。

    • 3:按照 IP 网段格式返回。

    default

    String

    设置 default 的值(可为空),无法将输入的 CIDR 地址块按照格式输出时,返回该值。

  • 返回结果

    返回特定格式的 IP 地址。

  • 函数示例

    • 示例 1: 将输入的 CIDR 地址块直接输出。

      • 原始日志

        ip: 192.168.1.0/24
      • 加工规则

        e_set("strNormal",ip_to_format(v("ip"),0))
      • 加工结果

        ip: 192.168.1.0/24
        strNormal: 192.168.1.0/24
    • 示例 2: 将输入的 CIDR 地址块按照 prefix 格式输出。

      • 原始日志

         ip: 192.168.1.0/24
      • 加工规则

        e_set("strNormal",ip_to_format(v("ip"),1))
      • 加工结果

        ip: 192.168.1.0/24
        strNormal: 192.168.1.0/24
    • 示例 3: 将输入的 CIDR 地址块按照 netmask 格式输出。

      • 原始日志

        ip: 192.168.1.0/24
      • 加工规则

        e_set("strNormal",ip_to_format(v("ip"),2))
      • 加工结果

        ip: 192.168.1.0/24
        strNormal: 192.168.1.0/255.255.255.0
    • 示例 4: 将输入的 CIDR 地址块按照 IP 地址网段格式输出。

      • 原始日志

        ip: 192.168.1.0/24
      • 加工规则

        e_set("strNormal",ip_to_format(v("ip"),3))
      • 加工结果

        ip: 192.168.1.0/24
        strNormal: 192.168.1.0-192.168.1.255

ip_overlaps

判断两个网段是否存在重叠。

  • 函数格式

    ip_overlaps(cidr_subnet, cidr_subnet2,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    cidr_subnet

    String

    输入 CIDR 地址块 1。

    cidr_subnet2

    String

    输入 CIDR 地址块 2。

    default

    String

    设置 default 的值(可为空),无法判断两个 CIDR 地址块是否重叠时,返回该值。

  • 返回结果

    • 如果两个 CIDR 地址块不重叠,则返回 0。

    • 如果两个 CIDR 地址块重叠在结束位置,则返回 1。

    • 如果两个 CIDR 地址块重叠在开始位置,则返回-1。

  • 函数示例

    • 示例 1:两个 CIDR 地址块不重叠。

      • 原始日志

        cidr1: 192.168.0.0/23
        cidr2: 192.168.2.0/24
      • 加工规则

        e_set("overlaps",ip_overlaps(v("cidr1"),v("cidr2")))
      • 加工结果

        cidr1: 192.168.0.0/23
        cidr2: 192.168.2.0/24
        overlaps: 0
    • 示例 2:两个 CIDR 地址块在开始位置重叠。

      • 原始日志

        cidr1: 192.168.1.0/24
        cidr2: 192.168.0.0/23
      • 加工规则

        e_set("overlaps",ip_overlaps(v("cidr1"),v("cidr2")))
      • 加工结果

        cidr1: 192.168.1.0/24
        cidr2: 192.168.0.0/23
        overlaps: -1
    • 示例 3:两个 CIDR 地址块在结束位置重叠。

      • 原始日志

        cidr1: 192.168.0.0/23
        cidr2: 192.168.1.0/24
      • 加工规则

        e_set("overlaps",ip_overlaps(v("cidr1"),v("cidr2")))
      • 加工结果

        cidr1: 192.168.0.0/23
        cidr2: 192.168.1.0/24
        overlaps: 1

ip2long

使用 ip2long 函数将字符串格式的 IP 地址转换成长整型数据。

  • 函数格式

    ip2long(value,default=0)
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    value

    String

    填入需要被转换的值。

    default

    String

    某个不合法的 IP 地址被转换成的值。支持自定义,例如:0。

  • 返回结果

    返回有效 IP 转换成功后的长整型数据。

  • 函数示例

    • 示例 1:默认情况

      • 原始日志

        ip: 192.168.0.100
      • 加工规则

        e_set("long_ip",ip2long(v("ip")))
      • 加工结果

        ip: 192.168.0.100
        long_ip: 167772160
    • 示例 2:非法 IP 情况

      • 原始日志

        ip: 47.100.XX.XX
      • 加工规则

        e_set("long_ip",ip2long(v("ip"), "ignore"))
      • 加工结果

        ip:47.100.XX.XX
        long_ip:ignore

long2ip

使用 long2ip 函数将长整型数据转换成字符串格式的 IP 地址。

  • 函数格式

    long2ip(value,default="")
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    value

    String

    填入需要被转换的值。

    default

    String

    表示将不合法的长整型数据转成空字符串,支持自定义。

  • 返回结果

    返回有效长整型转换成功后的 IP 地址。

  • 函数示例

    • 示例 1:默认情况

      • 原始日志

        long: 167772160
      • 加工规则

        e_set("ip",long2ip(v("long")))
      • 加工结果

        long: 167772160
        ip: 192.168.0.100
    • 示例 2:长整型转换 IP 地址失败情况

      • 原始日志

        long: 4294967296
      • 加工规则

        e_set("ip",long2ip(v("long")))
      • 加工结果

        long: 4294967296
        ip: 
    • 示例 3:长整型转换 IP 地址失败时自定义的错误处理。

      • 原始日志

        long: 4294967296
      • 加工规则

        e_set("ip",long2ip(v("long"),default="xxx"))
      • 加工结果

        long: 4294967296
        ip: xxx

 
推荐文章