최근 구축한 시스템에서 Log4j로 남기는 로그를 분석, 활용하기 위해 시험적으로 Logstash를 적용해보았다.
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로 색인해보도록 하겠다.