Elasticsearch node.js를 이용해서 데이터 입력(PUT) 하기
logstash이 잘되어있어서 패턴 잘구성해서 logstash을 이용해도 되지만 logstash패턴 사용하는 법을 좀 봐야되고...
잘 사용법도 모르는 환경에서 계속 서비스 RDBMS에 커넥션 유지하는 것도 부담스러워서 따로 node.js로 짜기로함
기본적으로 콘솔에서 curl 날리는 예시는 아래와 같음
$ curl -XPUT 'http://localhost:9200/logstash-2015.03.06/access_log/1' -d '{
> "host": "web01",
> "http_host": "192.168.1.123",
> "clientip": "192.2.3.55",
> "timestamp": "Fri Feb 06 2015 14:04:22 GMT+0900 (KST)",
> "verb": "GET",
> "request": "/css/comm.css",
> "httpversion": "1.1",
> "response": "304",
> "bytes": "0",
> "referrer": "http://192.168.1.124/",
> "agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17",
> "request_time": 0
> }'
등록 결과 아래와 같이 나온걸 볼 수 있다
{"_index":"logstash-2015.03.06","_type":"access_log","_id":"1","_version":1,"created":true}
브라우져에서 head 들어가보면 확인 가능하다.
http://localhost:9200/_plugin/head/
이걸 node.js http라이브러리이용하면 간단하다.
var http = require('http');
function elasticsearchPut(index,type,id,put_data){
var option = {
hostname: 'localhost',
port: 9200,
path: '/'+index+'/'+type+'/'+id,
method: 'PUT'
};
var req = http.request(option, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log(chunk);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
// DATA PUT
req.write(JSON.stringify(put_data));
req.end();
}
var index = 'logstash-2015.03.06';
var type = 'access_log';
var id = 2;
var data = {
"host": "web01",
"http_host": "192.168.1.123",
"clientip": "192.2.3.55",
"timestamp": "Fri Feb 06 2015 14:04:22 GMT+0900 (KST)",
"verb": "GET",
"request": "/css/comm.css",
"httpversion": "1.1",
"response": "304",
"bytes": "0",
"referrer": "http://192.168.1.124/",
"agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17",
"request_time": 0
};
elasticsearchPut(index,type,id,data);
콘솔에서 실행하면 아래와 같이 결과 메세지를 동일하게 볼 수 있다.
$ node test.js
STATUS: 201
HEADERS: {"content-type":"application/json; charset=UTF-8","content-length":"91"}
{"_index":"logstash-2015.03.06","_type":"access_log","_id":"2","_version":1,"created":true}
예시로 nginx access_log로 했는데 실제 사용하는데는 이벤트나 구매내역등 실제 서비스로그를 RDBMS에서 주기적으로 가져와서 분석하는 용도로 사용함
추가적 node.js 라이브러리 및 Bulk insert 참고