在日志处理过程中,常常会遇到ip地址的分析,就要涉及到ip地址解析为城市的操作。
下面介绍2种方法:
方法一:只能够进行中国的ip地址转换为城市的操作,国外的解析不是很实用。
方法二:可以进行全球的ip地址的各项解析,解析城市、国家、经纬度等等。
一个使用他人的源码来实现此功能的方法,希望能帮助有需要的人。
步骤如下:
$ git clone https://github.com/wzhe06/ipdatabase
或者:从百度云中下载:
链接:https://pan.baidu.com/s/1Rm9d44bv3Ewd5LZm1pUtwg
提取码:e6x9
$ mvn clean package -DskipTests
$ mvn clean install -DskipTest
在安装过程中,查看文件将jar放入到了maven的哪个目录下
com.ggstar
ipdatabase
1.0
org.apache.poi
poi-ooxml
3.14
package com.hzkj.spark.utils
import com.ggstar.util.ip.IpHelper
/**
* @Title: IpUtils
* @ProjectName SparkStreamingProject
* @Description: IP解析工具类
* @author fanyanyan
*/
object IpUtils {
def getCity(ip: String)={
IpHelper.findRegionByIp(ip)
}
def main(args: Array[String]): Unit = {
println(getCity("123.125.71.38"))
}
}
ipDatabase.csv
ipRegion.xlsx
记得要将这两个文件放入到自己项目的resources下
该方法需要下载好一个外部数据文件:
地址如下:
链接:https://pan.baidu.com/s/1u4_7dfspUYmKt21QBhjc7g
提取码:619p
下载好之后,将数据文件放入到指定路径下,便于后期调用。
在pom.xml文件中导入依赖:
com.maxmind.geoip2
geoip2
2.12.0
编写测试用例(IpUtils.java):
package com.fyy.spark.project.utils;
import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.*;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
/**
* @author fanyanyan
* @Title: IpUtils
* @ProjectName SparkStreamingProject
* @Description: 全球Ip地址转义(国家、城市、经纬度等)
*/
public class IpUtils{
/**
* Ip转换国家
* @param ip
*/
public static String getCountry(String ip) throws Exception{
File database = new File("E:\\IDEA\\IdeaProject\\SparkStreamingProject\\data\\GeoLite2-City\\GeoLite2-City.mmdb");
DatabaseReader reader = new DatabaseReader.Builder(database).build();
String countryName = "未知";
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = reader.city(ipAddress);
Country country = response.getCountry();
countryName = country.getNames().get("zh-CN");
return countryName;
}
/**
* Ip转换城市
* @param ip
*/
public static String getCity(String ip) throws Exception{
File database = new File("E:\\IDEA\\IdeaProject\\SparkStreamingProject\\data\\GeoLite2-City\\GeoLite2-City.mmdb");
DatabaseReader reader = new DatabaseReader.Builder(database).build();
String cityName = "未知";
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = reader.city(ipAddress);
City city = response.getCity();
cityName = city.getNames().get("zh-CN");
return cityName;
}
/**
* Ip转换经纬度
* @param ip
*/
public static Location getLocation(String ip) throws Exception{
File database = new File("E:\\IDEA\\IdeaProject\\SparkStreamingProject\\data\\GeoLite2-City\\GeoLite2-City.mmdb");
DatabaseReader reader = new DatabaseReader.Builder(database).build();
InetAddress ipAddress = InetAddress.getByName(ip);
CityResponse response = reader.city(ipAddress);
Location location = response.getLocation();
return location;
}
public static void main(String agrs[]) throws Exception {
IpUtils ipUtils = new IpUtils();
String ip = "123.125.71.38";
String city = ipUtils.getCity(ip);
System.out.println(city);
Location location = ipUtils.getLocation(ip);
System.out.println(location);
}
}
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.9.5
请修改依赖的版本为2.5.0即可。
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.
请调整pom.xml文件中依赖的优先级即可。(未出现问题,请略过)
其他方案请参考github:
https://github.com/maxmind/GeoIP2-java