根据IP地址解析出所属国家、省份和市信息。
函数格式
geo_parse(ip, ip_db="SLS-GeoIP", keep_fields=None, provider="ipip", ip_sep=None)
解析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: 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地址为IPv4还是IPv6。若是IPv4类型IP地址,则返回IPv4,若是IPv6类型IP地址,则返回IPv6。
函数格式
ip_version(ip, default="")
判断IP地址是私有地址还是公有地址,返回IP类型包括private、reserved、loopback、public和allocated ripe ncc等。
函数格式
ip_type(ip, default="")
原始日志
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: 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
将输入的CIDR地址块按照Prefixlen或者Netmask格式输出。
函数格式
ip_to_format(cidr_subnet, want_prefix_len=0, default="")
原始日志
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
原始日志
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
原始日志
ip: 47.100.XX.XX
加工规则
e_set("long_ip",ip2long(v("ip"), "ignore"))
加工结果
ip:47.100.XX.XX
long_ip:ignore
原始日志
long: 4294967296
加工规则
e_set("ip",long2ip(v("long"),default="xxx"))
加工结果
long: 4294967296
ip: xxx