[2021.07.26] 인턴 +147 Tips)How to display on a map using latitude and longitude in elasticsearch?(+ 공기질 데이터 수집 하는 방법(포스트맨 POSTMAN), geoip 변환 시 중요한점)
해당 게시글은, 아파치 로그(apache log) 또는 IP로 maps에 표시하는 것이 아니다.
단지, 위도와 경도로만 maps(geoip) 에 표시하는 방법을 알아보자.
----------------------------------------------------------------------------------------------------------------------------
우선, kibana에 접속하여 dev tools에 아래와 같은 명령어를 수행하자.
PUT 0726_finall_air_quality
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
-> 위의 코드를 복붙해주면 true 라고 200-OK 정상적으로 실행 된다.
----------------------------------------------------------------------------------------------------------------------------
0726_finall_air_quality.conf
error message
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
* 해결방법
-> logstash경로 설정
ubuntu@ip-172-31-9-174:/usr/share/logstash/bin$ ./logstash -f 1800_final_air.conf --path.settings /etc/logstash/
<소스코드>
input {
jdbc {
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.25.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/DATA?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "select * from air_quality"
type => "air_quality"
tracking_column => "table_12"
use_column_value => true
}
}
filter {
csv {
separator => ","
columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "TimeZone", "ReportTime", "lat", "long","doc_id"]
}
mutate {convert => ["lat", "float"]}
mutate {convert => ["long", "float"]}
mutate {
add_field => {"[location][lat]" => "%{lat}"}
add_field => {"[location][lon]" => "%{long}"}
}
mutate {
convert => {"[location][lat]" => "float"}
convert => {"[location][lon]" => "float"}
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "geo_test10"
user => "elastic"
password => "d2L79ArdVSJqbxqATuKj"
document_id => "%{doc_id}"
}
stdout {
#codec => dots {}
codec => rubydebug
}
}
input {
jdbc {
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.25.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/DATA?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "select * from air_quality"
type => "air_quality"
tracking_column => "table_12"
use_column_value => true
}
}
filter {
csv {
separator => ","
columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "TimeZone", "ReportTime", "lat", "long","doc_id"]
}
mutate {convert => ["lat", "float"]}
mutate {convert => ["long", "float"]}
mutate {
add_field => {"[location][lat]" => "%{lat}"}
add_field => {"[location][lon]" => "%{long}"}
}
mutate {
convert => {"[location][lat]" => "float"}
convert => {"[location][lon]" => "float"}
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "0726_finall_air_quality"
user => "elastic"
password => "d2L79ArdVSJqbxqATuKj"
document_id => "%{doc_id}"
}
stdout {
#codec => dots {}
codec => rubydebug
}
}
---------------------------------------------------------------------------------------------------------------------------------
<실행 결과>
------------------------------------------------------------------------------------------------------------------------
공기질측정기 데이터 수집 하는 방법(포스트맨 POSTMAN)
* 아래사진처럼 설정해주면 됨
1. POST https://us-central1-mytypescript-62c14.cloudfunctions.net/getData?
2. Headres Content-Type : application/json
3. Body
{
"fromDate" : "20210726000000",
"toDate" : "20210726235959",
"serialNum" :"abc"
}
-> 출력된 데이터값을 3시방향 동그라미 클릭해서 복사
--------------------------------------------------------------------------------------------------------------------------
이제, Lat 과 Long(위도와 경도) 데이터가 암호화되서 나왔기 때문에 정렬 후 , 암호화된 데이터를 삭제하고 저장하자.
-> 이제 암호화된 위도와 경도를 버리고 수치 값으로 나온 위도와 경도를 잘라내기 후, 새로 엑셀파일을 열어서 저장하면 끝
-------------------------------------------------------------------------------------------------------------------------------
* 08.16 geoip 변환 시 중요한점(conf 파일에서 filter 할 때 중요)
<conf 파일에서 geo_location의 값을 제대로 넣지 않았을 때>
-> 출력 보면, geo_location 타입의 lon의 값이 0.0으로 들어간 것을 알 수 있다.
-> 처음에 conf 파일이 geoip에 대해 반환을 못해서 위치가 바다에 찍혔다.(앞에서 말했다 시피, 위에서 lon 값이 0.0 이라서)
<08.16 작동하는 conf 파일>
input {
jdbc {
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.26.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/AIR?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "select * from hanbang_air_data"
type => "hanban_air_data3"
tracking_column => "table_6"
use_column_value => true
}
}
filter {
#csv {
# separator => ","
# columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "timeZone", "ReportTime", "Lat", "Lng"]
# }
mutate {convert => ["lat", "float"]}
mutate {convert => ["lng", "float"]}
mutate {convert => ["co2", "float"]}
mutate {convert => ["vocs", "float"]}
mutate {convert => ["pm10", "float"]}
mutate {convert => ["pm5", "float"]}
mutate {convert => ["humid", "float"]}
mutate {convert => ["temp", "float"]}
mutate {
add_field => {"[location][lat]" => "%{lat}"}
add_field => {"[location][lon]" => "%{lng}"}
}
mutate {
convert => {"[location][lat]" => "float"}
convert => {"[location][lon]" => "float"}
}
}
output {
if[type] == "hanban_air_data3" {
elasticsearch {
hosts => "logstash.monorama.kr:9200"
index => "hanban_air_data3"
user => "elastic"
password => "IfhOjyslb5wE0yTd8kQa"
document_id => "%{num}"
}
}
stdout {
#codec => dots {}
codec => rubydebug
}
}
-> 해당 공기질 데이터들은 소수형으로 값이 반환 되기 떄문에, mutate를 이용하여 float으로 type을 변환해줘야 한다.
<출력 결과>
-> 여기서 보면 출력결과가 lat,lng 로 되어 있기 때문에 float으로 반환 해줘야 한다.
-> 위의 사진의 출력결과를 보면서 lat,lng을 밑줄 친 lat,lng에 넣어주면 된다.
<위도와 경도로 지도 찍은 사진>
댓글