본문 바로가기
DevOps/Logging

[graylog2] 적용

by cusmaker 2018. 5. 22.
반응형





증가된 서버로 인해 분산된 로그를 한눈에 보고자 도입한 GrayLog2

여러 후보중 가장 큰 이유는 오픈소스이고, 

최근에 업데이트가 활발했기때문에 다양한 환경에 추가할 수 있도록 라이브러리가 존재했다.


현재 구조는 Front Web과 Backend API의 2-Tier 구조인데

목표는 둘다 붙이는 것이었지만 일단 중요한 Backend API 서버군에 목표를 두었다.


Backend API는 Grails 2.4.3 프레임워크로 구성이 되어있어, 

graylog2용 Grails Plugin을 어렵지 않게 구할 수 있었다.


dependencies in BuildConfig.groovy

--------------------------------------

runtime 'org.graylog2:gelfj:1.1.13'



Config.groovy

--------------------------------------

log4j = {

environments {

development {

appender new org.graylog2.log.GelfAppender(

name: 'gelfAppender',

graylogHost: '1.1.1.1',

graylogPort: 12201,

extractStacktrace: true,

includeLocation: true,

addExtendedInformation:true

)

all gelfAppender :'com.happycode'

error gelfAppender:'org.hibernate'

}

}


먼저 위의 설정을 Grails에 넣어주고

아래 URL을 참고하여 서버 구축을 하였다.

https://www.itzgeek.com/how-tos/linux/centos-how-tos/how-to-install-graylog2-on-centos-7-rhel-7.html


기본 동작 방식은 log4j와 연동이 되어 

logging되는 모든 내용을 graylog2 서버로 전송한다.

기본은 로깅되는 모든 텍스트가 전송이 되지만,

graylog2서버에서 파라미터별로 분석을 하기위해 

별도 json포멧으로 로깅을 남기는 구문을 추가해주었다.


평소에 로그 남기던 데로... 다만 분석을 위해 모든 파라미터를 JSON 포멧으로!


logger.info(logData as JSON);


그전에 모든 API에는 응답 코드가 있는데

다행이 이러한 코드들을 미리 정리해둔덕에

분석에 도움이 되었다.



서버 구축 이후에는 생각보다 간단하게 로그 수집을 할 수 있었는데

Input 메뉴에서  GELF UDP 형식으로 

Port를 구분하여 추가해주면 끝.


초기 목적은 단순히 로그를 서버에 직접 들어가서 확인하지말고

수집해서 하나의 서버에서 확인하자! 였는데..

이게 생각보다 여러모로 많이 유용했다.


단순히 지표별로 그래프를 추가하고 분석해 볼 수 있을 뿐만 아니라


특정 조건에 대해서만 로그를 모아 볼 수 있는 Stream을 통해

조건을 만족하면 이메일이나 http 요청을 날려 대응 할 수 있다.


예를 들어 특정 IP로 인증 API 실패값이 지속적으로 들어오면

brute force 공격으로 의심 할 수 있고

이를 http 알림을 통해 IP를 차단하는 방식으로 공격을 차단했다.


또한 코드레벨에서 에러가 나는 경우,

에러 메세지를 개발자에게 이메일로 발송하고,

스크럼 툴에 연계하여 해당 에러에 대한 backlog를 생성 하여 에러에 대해 바로 인지하고 처리 할 수 있게 되었다.