본문 바로가기

IT/Logstash

Logstash - Elasticsearch 연동을 위한 로깅 처리 기록 #1

최근 구축한 시스템에서 Log4j로 남기는 로그를 분석, 활용하기 위해 시험적으로 Logstash를 적용해보았다.

요구사항은 다음의 두 가지 :

1) 에러 발생시 Watcher를 활용, notification 기능을 구축하기 위해 
ERROR 레벨로 떨어지는 로그를 잡아 에러 내용을 전송해 줄 것.

2) Kibaba와 연동하여 시간대별 처리내역을 실시간으로 확인하기 위해
INFO 레벨로 떨어지는 로그를 잡아 수행된 프로세스의 count를 전송해 줄 것.

Watcher를 활용한 notification 기능 구현은 메일 송수신과 관련된 사내 보안망에 걸려 구현 확인에 실패했지만,
실시간으로 떨어지는 로그를 Logstash를 활용하여 filtering, mutating 하여 ES에 색인하는 과정을 기록해둔다.




Logstash의 File Input Plugin은 파일의 물리적인 경로를 path 변수에 정의하고,

만족하는 모든 파일을 tailing 하여 새로운 내용이 파일에 추가될 때마다 이를 event에 담아준다.


Logstash를 적용하기 전, 시스템은 Log4j의 RollingFileAppender의 TimeBasedRollinPolicy를 적용, 

INFO 레벨과 ERROR 레벨을 구분하여 일 별로 로그를 남기고 있었으며

쉘 스크립트를 주기적으로 수행하여 보름치의 로그만을 유지하고 있었다.


로그가 떨어지는 폴더구조와 로깅을 위한 log4j 설정은 다음과 같다.

log
/--- FILE
    /--- 2015
        /--- 12
    /--- 2016
        /--- 01
        /--- 02
            :
/--- ATTACHMENT
    /--- 2015
        /--- 12
    /--- 2016
        /--- 01
        /--- 02
            :


	
	
		
	
	
		
	




	
	
		
	
	
		
	

${sourcename} 은 배치프로그램 구동시 넘겨주는 작업 대상 source의 영문코드명이다.


첫번째로 마주친 문제는 Logstash의 File Input Plugin에선 path에 환경변수도, 상대적 값도 넣지 못한다는 것이었다.

데이터 안정성을 위해 환경설정의 동적 적용도 논의는 되지만 실질적인 API는 제공되지 않고 있는 상황이다.

(관련링크)


와일드카드(*)는 허용되므로, 무식하게 "/log/*/*/*/*_info.log" 라고 정의해 줄 수는 있지만,

낙관적으로 보름치의 로그만 남기고 삭제해주는 쉘스크립트에서 빈 로그 폴더들을 삭제해준다고 쳐도

최소한 source의 수 x 15 개의 파일을 실시간으로 tailing하게 되는 셈이라 빈 말로도 나쁘지 않다고 해줄 수 없었다.




결국 Logstash를 적용하기 전 시스템의 log4j 설정부터 변경하기로 결정, 당일의 로그는 접미사 없이 기록하다가

날짜가 넘어가는 순간 DatePattern을 붙여 rolling 해주는 DailyRollingFileAppender를 사용하기로 결정했다.


위쪽의 RollingFileAppender 설정 관련된 xml코드를 대체할 DailyRollingFileAppender xml코드는 다음과 같다.



	
	
	
	
		
	




	
	
	
	
		
	


당일 기록된 로그는 날짜 접미사 없이 logsource.info.log로 기록하고, (info 로그의 경우)

날짜가 지나면 기록하던 로그에 yyyy-MM-dd 형식으로 날짜를 붙여 이전하고 새로 기록하게 된다.


현재 날짜가 2016년 2월 10일이고, 로그를 기록한지 오늘로 3일째 되는 날이라면

결과적으로 로그 폴더에는 다음과 같이 3개의 로그 파일이 존재하게 되는 것이다.


logsource.info.log

logsource.info.2016-02-08.log

logsource.info.2016-02-09.log


적절한 형태로 파일이 제대로 떨어지는걸 확인했으니,

다음 포스팅에서 해당 파일을 Logstash로 감시하여 Elasticsearch로 색인해보도록 하겠다.