Logstash 란?
이름 그대로 로그를 저장한다라는 의미를 가지고 있다.
로그라는 것은 반정형데이터이며 세상의 모든것이 로그가 될 수 있기때문에 로그 형태를 강제할 방법도 없다. 결국 로그를 수집하는 쪽에서 로그형태를 분석하고 시스템에ㅔ서 인식할 수 있도록 로그를 정제하는 작업이 필요하다.
로그스테시는 이과정을 쉽고 편하게 할 수 있도록 지원한다. 어떤 형태의 로그에 대해서도 로그를 수집 - 가공 - 전송하는 일련의 과정을 간편하게 구현하기 위한 강력한 기능까지 제공한다.
기본적인 시스템 흐름
- 데이터수집 -> 데이터가공(로그스태시) -> 데이터저장(엘라스틱 서치) -> 분석&시각화(키바나)
로그스태시 특징
- 플러그인 기반: 로그스태시의 파이프라인을 구성하는 각 요소들은 전부 플러그인 형태로 만들어져있다. 기본으로 제공되는 플러그인 외에도 수많은 커뮤니티 플러그인을 찾을수 있다. 플러그인 개발을 위한 프레임워크를 포함하고 있고 플로그인을 관리할 수 있는 기능도 제공한다.
- 모든 형태의 데이터 처리 : 기본 제공되는 플러그인들의 조합만으로 대다수의 데이터 소스에서 JSON,XML 등의 구조화된 텍스트 뿐만 아니라 다양한 형태의 데이터를 입력받아 가공한 다음에 저장할 수 있다.
- 성능: 자체적으로 내장되어 있는 메모리와 파일 기반의 큐를 사용하므로 처리속도와 안정성이 높다. 인덱싱할 도큐먼트의 수와 용량을 종합적으로 고려해 벌크 인덱싱을 수행할 뿐 아니라 파이프라인 배치 크기 조정을 통해 병목현상을 방지하고 성능 최적화를 할 수 있다.
- 안정성: 엘라스틱 서치의 장애 상황에 대응하기 위한 재시도 로직이나 오류가 발생한 도큐먼트를 따로 보관하는 데드 레터 큐를 내장하고 있다.
로그 레벨
- fatal : 시스템 동작을 멈출정도의 심각한 오류 발생시
- error : 시스템 동작이 멈추진않지만 오류가 발생시
- warn : 잠재적인 오류를 포함하는 경고성 로그
- info : 진행상황이나 상태 변경 등의 정보를 알기 위한 로그들
- debug : 개발 과정에서 디버깅을 하기 위한 로그들
- trace : 시스템 진행 과정 추적을 위한 로그들
파이프 라인
로그스태시의 가장 중요한 부분은 파이프 라인이다.
파이프라인
- 데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 역할을 하는 로그스태시의 핵심 기능
- 파이프라인은 입력, 출력이 필수 구성 요소이고 필터는 옵션이다.
- 데이터 흐름은 입력 -> 필터 -> 출력
입력
데이터를 입력받는 단계 직접 받을 수도 있지만 서버를 열어서 받아들일수도 있다.
자주 사용하는 입력 플러그인
- file : 리눅스의 tail -f 명령처럼 파일을 스트리밍하며 이벤트를 읽어 들인다.
- syslog : 네트워크를 통해 전달되는 시스로그를 수신
- kafka : 카프카 토픽에서 데이터를 읽어드린다.
- jdbc: JDBC 드라이버로 지정한 일정마다 쿼리를 실행해 결과를 읽어들인다.
필터
입력받은 데이터를 유의미한 정형데이터로 가공
자주 사용하는 필터 플러그인
- grok : grok 패턴을 사용해 메시지를 구조화된 형태로 분석한다. grok 패턴은 일반적인 정규식과 유사하나, 추가적으로 미리 정의된 패턴이나 이름 설정, 데이터 타입 정의 등을 도와준다.
- dissect : 간단한 패턴을 사용해 메시지를 구조화 된 현태로 분석한다. 정규식을 사용하지 않아 grok에 비해 자유도는 조금 떨어지지만 더 빠른 처리가 가능하다.
- mutate : 필드명을 변경하거나 문자열 처리 등 일반적인 가공 함수들을 제공한다.
- date : 문자열을 지정한 패턴의 날짜형으로 분석한다.
grok
- grok 문법
- 상세 SYNTAX
- logstash input에서 감지해야하는 정규식 패턴이다.
- SEMANTIC
- 감지된 패턴 데이터를 할당할 logstash 변수명(identifier, 식별자)이다.
sincedb 데이터베이스 파일
sincedb 데이터베이스 파일은 파일을 어디까지 읽었는지 기록하는 파일이다.
출력
출력은 파이프 라인의 입력과 필터를 거쳐 가공된 데이터를 지정한 대상으로내보내는 단계다.
자주 사용하는 출력 플러그인
- elasticsearch: bulk API를 사용해 엘라스틱 서치에 인덱싱을 수행
- file : 지정한 파일의 새로운줄에 데이터 기록
- kafka : 카프카 토픽에 데이터를 기록
코덱
코덱은 입력/출력/필터와 달리 독립적으로 동작하지 않고 입력과 출력 과정에 사용되는 플러그인이다. 입/출력 시 메시지를 적절한 형태로 변환하는 스트림 필터이다.
코덱 플러그인
- json : 입력시 json 형태의 메시지를 객체로 읽어 들인다.
- plain : 메시지를 단순 문자열로 읽어들인다. 출력시에 원하는 포맷지정가능
- rubydbug : 로그스태시의 설정을 테스트하거나 예기치 못한 파이프라인 설정오류를 디버깅하는 목적으로 주로 사용되고 루비 언어의 해시 형태로 이벤트를 기록한다. 입력시엔 사용되지 않는다.
다중 파이프라인
하나의 로그 스태시에서 여러개의 파이프라인을 동작하는 방법이다.
파이프라인 설정 yml
- pipeline.id : 파이프라인의 고유아이디
- path.config: 파이프라인설정 파일의 위치
- pipline.workers : 필터와 출력을 병렬로 처리하기 위한 워커수,
- pipeline.batch.size : 입력시 하나의 워커당 최대 몇개 까지의 이벤트를 동시에 처리할지를 결정한다. 배치 처리된 이벤트들은 엘라스틱 서치 출력에서 하나의 벌크 요청으로 묶이기 때문에, 이 수치가 클수록 요청 수행횟수가 줄어들어 인덱싱 성능 개선 효과가 있지만 그만큼 단일 요청이 커지므로 1000, 2000 과 같이 적당히 조절해가며 튜닝할 필요가 있다.
- quere.type : 파이프라인에서 사용할 큐의 종류를 정할 수있다. 기본적으로 memory 타입이 사용되나 persisted 타입을 선택해 이벤트 유실을 좀 더 최소화 할수도 있다.
모니터링
로크스테시가 제공하는 api
9600 포트로 로그스테시가 제공하는 REST API 를 사용할수 있다.
localhost:9600?pretty
api list
- 노드 : /_node
- 플러그인 : /_node/plougins
- 노드통계 : /_node/stats
- 핫 스레드 : /_node?hot_threads