본문 바로가기

카테고리 없음

Logstash 사용

반응형

logstash 는 로그를 수집 분석하여 원하는 곳으로 데이터를 보낼수있도록 해준다.



logstash 에 관심을 가지게 된 계기는 syslog 를 수집하여 파일로 저장하고 분석하여 특정한 장비로 분석 내용으로 만들어낸 command 를 보내도록 하는 작업을 하면서이다.

특히 syslog 데이터에는 Time,log message,macAddress,IPAddress 와 같은 정규화된 데이터들이 포함되어있다.

syslog 수집은 syslog4j 를 사용하여 수집 하도록 하였다.

자바에서 제공하는 util 패키지에 있는 정규식 라이브러리를 사용하게 되었다.

syslog receive server 를 구축하여 syslog 를 구축하고,정규식을 사용하여 syslog 를 분석하여야 하는 과정을 거쳐야 했다.

이런 과정을 단순화 할 수 있는 방법이 logstash 라는것을 회사선배로부터 알게 되어 조사하게 되었다.

또 다른 이유는 데이터 분석을 위해 웹크롤러를 통하여 웹 사이트이 데이터들을 수집 하는데 있었다.

수집 된 데이터 또한 html 정규화 패턴 들이여서 유용할 거라 생각 되었다.

또한 수집 된 데이터를 분석하고 통계를 내는데도 꽤 유용하다고 어느 블로거에서 소개하고 있었기 때문이다.( 사용해봐야 알겠지만 ^^ )


logstash 설치:

logstash 는 java 7 이후 버전이어야 한다.

일단 logstash 를 다운 받자

다운링크 : https://www.elastic.co/downloads/logstash

압축을 풀고 bin 폴더안에 윈도우,유닉스,리눅스 에서 실행가능한 파일들이 존재한다.

윈도우 같은 경우에는 bat 파일을 prompt 창에서 실행 하면 된다.

logstash 설치  step


logstash 의 config 파일은 크게  아래와 같이 input/filter/output 으로 되어있다.

input 으로 들어오는 데이터를 filter 를 거쳐서 output 으로 보내게 되는데 이때 사용용도에 따라 로그의 형태가 다를 경우 filter 를 사용하여 데이터 분석 및 재정의가 가능 하다.


command lind 의 입력에 대한 로그를 처리하는 것은 아래와 같다.

bin/logstash -e 'input { stdin { } } output { stdout {} }'

설정 파일을 사용하여 실행 할 경우에는 아래와 같다.

bin/logstash agent -f logstash.conf
 

logstash 구조 : 




logstash 의 구조에서 보듯이 Filter 같은 경우에는 grok 패턴을 사용한다.물론 statement 문장도 사용 가능하다.

statement 를 사용가능 하다는것은 들어오는 데이터에 따라 분류할 수도 있다는 .....것이다.


config파일의 구성:


기본적으로 input/filter/output


  - input은 logstash가 로그를 수집할 대상에 대한 정보를 설정한다.
  - filter는 로그에 대한 분해(parsing)를 지원하기 위한 설정들을 한다.
  - output은 수집된 로그를 적재/노출 할 대상에 대한 정보를 설정한다.
    # 추가 적으로  codec 은 input,output 등에서 사용될 데이터에 대한 형식을 의미함.

    ex: 일반적인 메시지 수준이라면 plain이고 json 과 같은 형식을 사용 할 수도 있음 

input :

input에서는 데이터를 수집할 대상에 대한 정의를 해주는데, logstash가 기본적으로 제공해주는 대상은 약 40여가지 된다.
쉽게 살펴볼 수 있는 apache accesslog 나 log4j에서 발생되는 로그를 수집하기 위해서는 일반적으로 file, tcp 등을 이용하여 데이터를 수집한다.
log4j의 경우 별도의 input 설정을 통해 log4j에서 바로 logstash로 전달 할 수도 있다. 각각의 간단한 input 설정 예제는 다음과 같다.

input {
file {
# path는 대상 파일의 절대경로를 작성(accesslog 나 exception log 파일 위치)
path => "/Users/evilimp/Dev/elk/logs/square.log"
# type은 대상 데이터들에게 붙여주는 일종의 alias와 같다.
elasticsearch에
저장하는 경우 type이 별도의 항목으로 저장된다.
type => "square"
}
tcp {
# tcp 통신에 대해 수집할 대상 서버의 host 정보
host => "localhost"
# tcp로 확인할 port 정보. port는 mode라는 설정 항목에 따라서 의미가
변하는데 mode가 server인 경우 데이터가 들어오기를
기다리고 있는(리스닝) port를 의미하고,
mode가 client인 경우에는 데이터를 수집할 port를 의미한다.
port => 3333
# 추가 필드 정의
add_field => { "server" => "square" }
type => "tomcat"
}
log4j {
# log4j는 기본적으로 SocketAppender를 이용하여 발생되는 로그를
socket 통신으로 타서버로 전송해주는 것을 전제한다. 물론 대상 서버가 localhost여도 된다.
# 대상 서버 host 정보
host => "localhost"
# log4j 로 확인할 port 정보.
port => 4560
type => "log4j"
}
}

output

input으로부터 수집된 데이터를 적재 또는 전송하기 위한 정의해주는데, 
input과 마찬가지로 logstash가 이미 60여가지의 대상을 지원해주기 때문에 생각하는 대상이 있다면 먼저 
logstash가 지원해주는지를 확인하는 것이 필요하다. 샘플로 콘솔에 데이터를 출력하면서 elasticsearch에 
데이터를 적재하는 설정을 확인해보면 다음과 같다. 더 많은 설정 항목이 있지만 로컬에 기본으로 설치한 
elasticsearch의 경우에는 host만 지정해주어도 데이터가 적재된다.(이는 logstash와 elasticsearch가 
json으로 통신하기 떄문에 해당 json 형태대로 elasticsearch에 자동으로 인덱싱(logstash-{YYYY.MM.DD)된다.)

output {
stdout{} # 콘솔에 바로 출력
elasticsearch {
# elasticsearch가 구동되고 있는 서버 host 정
host => "localhost"
}
}

filter

logstash에서는 input에서 수집한 데이터를 가공/변형하기 위한 사전정의된 50가지의 filter를 사용할 수 있다. 
filter에서 사용되는 RegExp 패턴들은 logstash 폴더 내 patterns 폴더 하위에 적재되어 있는데 필요한 경우 이
 pattern들을 활용하여 데이터를 좀 더 쉽게 가공할 수 있다
(기본적으로 120가지의 패턴을 제공함(https://github.com/logstash/logstash/tree/v1.4.2/patterns)). 

다음은 multiline 처리와 grok이라는 비정형 데이터를 파싱하여 정형데이터로 변형해주기 위한 filter를 설정하는 예제이다.

filter {}
multiline {
patterns_dir => "/Users/evilimp/Dev/elk/logstash/patterns"
pattern => "(^%{TOMCAT_DATESTAMP})|(^%{CATALINA_DATESTAMP})"
negate => true
what => "previous"
}
grok {
patterns_dir => "/Users/evilimp/Dev/elk/logstash/patterns"
match => [ "message", "%{TOMCATLOG}", "message", "%{CATALINALOG}" ]
}

위의 자료는 어느 블로그에서 가져온 자료이다.(주소가 생각이 안나서 ㅠㅠ 나중에 링크)


다음은  logstash 를 사용하는데 있어서 filter 관련 설정을 위한 grok 패턴 사용법이다.


Grok 패턴 관련 

discover 메뉴에서 찾으려는 패턴을 알아보려면 문장을 입력하고 discover 버튼 클릭시 패턴을 찾아 준다.


json fomatter 에서 json 형식을 검사 할 수 있다.

logstash 는 기본적으로 json 형식의 name 기반으로 처리 하게 된다.
name:value 가 있는 것들만 처리됨.

syslog의 경우 matcher 를 지정 하게 되는데 문자열에 대한 모든 패턴을 지정 해 주어야 한다. 
불필요한 데이터는 name 을 설정 해주지않으면 logstash 에서 처리 하지 않게 된다.

logstash 사용을 위해 참고 할수있는 링크
http://www.programkr.com/blog/MMTOwEDMwYTx.html
 


반응형