-
로그스태시(Logstash) 설치 및 사용법ELK Stack 2022. 6. 19. 17:31
p. 213
- 로그란 시스템에서 일련의 동작 과정을 기록하는 것
p. 214
- 로그를 수집하느 쪽에서 로그 형태를 분석하고 시스템에서 인식할 수 있도록 로그를 정제하는 작업이 필요한데, 로그스태시는 이 과정을 쉽고 편하게 할 수 잇도록 지원한다.
- 로그를 수집- 가공 - 전송하는 일련의 과정
- 로그스태시는 플러그인 기반의 오픈소스 데이터 처리 파이프라인 도구다.
- 데이터 전처리 과정을 별도의 애플리케이션 작성 없이 비교적 간단한 설정만으로 수행할 수 있다.
p. 215
로그스태시 특징
- 플러글인 기반
- 모든 형태의 데이터 처리
- 성능
- 안정성
- 데드 레터 큐(dead letter queue)
p. 216
로그스태시 설치
- 로그스태시는 엘라스틱서치, 키바나 설치와 다르게 자바 가상머신(JVM)을 먼저 설치해야 한다. (설치되어 있으면 바로 엘라스틱 공식 홈페이지 가서 설치)
https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html
Getting Started with Logstash | Logstash Reference [8.2] | Elastic
Bundled JDK Logstash offers architecture-specific downloads that include Adoptium Eclipse Temurin 11, the latest long term support (LTS) release of the JDK. Use the LS_JAVA_HOME environment variable if you want to use a JDK other than the version that is b
www.elastic.co
p. 222
bin 폴더 - 로그스태시 실행 파일
config 폴더 - 로그스태시 설정 파일(logstash.yml) 과 파이프라인 설정 파일(pipelines.yml)
실행
- bin 폴더에 있는 logstash.bat 파일을 실행
- 로그스태시를 실행하기 위해서는 반드시 파이프라인 설정이 필요하다
- 파이프라인 설정은 따로 설정 파일을 만들어서 기록하거나 config 폴더의 pipelines.yml에 기록하는데, -e 옵션을 사용하면 콘솔에서 직접 파이프라인을 설정할 수 있다.
p. 223
- 파이프라인은 운영체제제의 표준 입력(stdin)으로 전달받은 메시지를 다시 표준 출력(stdout)으로 표시
- --log.level error는 로그 중 error 레벨 미만의 로그는 감추는 설정
- error 로그 레벨은 스크린 샷이 길어지는 것을 막기 위해 추가한 옵션
로그 레벨
로그 레벨 설명 fatal 시스템 동작을 멈출 정도의 심각한 오류 발생 시 나타나는 로그들 error 시스템 동작을 멈추지는 않지만 오류가 발생할 때 나타나는 로그들 warn 잠재적인 오류를 포함하는 경고성 로그들 info 진행 상황이나 상태 변경 등의 정보를 알기 위한 로그들 debug 개발 과정에서 디버깅을 하기 위한 로그들 trace 시스템 진행 과정 추적을 위한 로그들 파이프라인
- 데이터를 입력받아 실시간으로 변경하고 이를 다른 시스템에 전달하는 역할을 하는 로그스태시의 핵심 기능
- 구성 요소 : 입력, 필터, 출력
- 필수 구성요소 : 입력, 출력
- 옵션 : 필터
p. 224
파이프라인 실행 순서
- 입력, 필터, 출력 순으로 실행
- 입력 : 소스로부터 데이터를 받아들이는 모듈
- 필터 : 입력으로 들어오는 데이터를 원하는 형태로 가공하는 모듈
- 출력 : 데이터를 외부로 전달하는 모듈
- 파이프라인에 입력과 출력은 반드시 포함돼야 하며 입력, 필터, 출력 각 단계에서 복수의 플러그인을 포함시킬 수 있다.
- JSON 형태로 데이터를 출력
- @version이나 @timestamp는 로그스태시가 만든 필드 로 혹시 사용자가 만든필드와 충돌이 날 것을 대비해 앞에 @기호가 붙음
- message, host 필드는 데이터와 시스템 사용자를 나타낸 것
- @ 기호는 로그스태시에 의해 생성된 필드, 붙지 않은 필드는 수집을 통해 얻어진 정보
- 간단한 파이프라인일 경우 방금처럼 콘솔에서 직접 작성할 수 있지만 작업의 이력 관리를 위해 pipelines.yml이나 파이프라인 설정 파일을 만들어 로그스태시를 동작하는 것이 좋다.
p. 225
입력
- 파이프라인의 가장 앞부분에 위치하며 소스 원본으로부터 데이터를 입력받는 단계
p. 226
자주 사용하는 입력 플러그인
입력 플러그인 설명 file 리눅스의 tail -f 명령처럼 파일을 스트리밍하며 이벤트를 읽어 들인다. syslog 네트워크를 통해 전달되는 시스로그를 수신한다. kafka 카프카의 토픽에서 데이터를 읽어 들인다. jdbc JDBC 드라이버로 지정한 일정마다 쿼리를 실행해 결과를 읽어 들인다. p. 227
- 입력 : file 플러그인
- 출력 : 표준 출력(stdout)
- path : 읽어들일 파일 위치
- elasticsearch.log 파일을 읽는 것으로 설정했는데, 파일에 로그가 쌓이면 실시간으로 elasticsearch.log 파일의 변경을 감지해 읽어들인다.
- start_position은 최초 파일을 발견했을 때 파일을 읽을 위치, 파일의 시작 부분부터 읽어들일지 끝부분부터 새로운 라인만 읽어 들일지 정할 수 있다.
- 출력은 표준 출력 플러그인을 사용했기 때문에 입력이 발생하면 모니터에 출력한다.
p. 228
필터
- 입력 플러그인이 받은 데이터를 의미 있는 데이터로 구조화하는 역할
- 필수 구성요소가 아니어서 필터 없이 파이프라인을 구성할 수 있지만, 필터 없는 파이프라인은 그 기능을 온전히 발휘하기 힘들다.
- 데이터를 정형화하고 사용자가 필요한 데이터 형태로 가공하는 데 핵심적인 역할을 한다.
p. 229
자주 사용되는 필터 플러그인
필터 플러그인 설명 grok grok 패턴을 사용해 메시지를 구조화된 형태로 분석한다. grok 패턴은 일반적인 정규식과 유사하나, 추가적으로 미리 정의된 패턴이나 필드 이름 설정, 데이터 타입 정의 등을 도와준다. dissect 간단한 패턴을 사용해 메시지를 구조화된 형태로 분석한다. 정규식을 사용하지 않아 grok에 비해 자유도는 조금 떨어지지만 더 빠른 처리가 가능하다. mutate 필드명을 변경하거나 문자열 처리 등 일반적인 가공 함수들을 제공한다. date 문자열을 지정한 패턴의 날짜형으로 분석한다. p. 232
filter의 mutate 플러그인
- 필드를 변형하는 다양한 기능을 제공
- 필드 이름을 바꾸거나 변경하거나 삭제하는 작업
- 옵션
mutate 옵션 설명 splite 쉼표(,) 같은 구분 문자를 기준으로 문자열을 배열로 나뉜다. rename 필드 이름을 바꾼다. replace 해당 필드값을 특정 값으로 바꾼다. uppercase 문자를 대문자로 변경한다. lowercase 문자를 소문자로 변경한다. join 배열을 쉼표(,) 같은 구분 문자로 연결해 하나의 문자열로 합친다. gsub 정규식이 일치하는 항목을 다른 문자열로 대체한다. merge 특정 필드를 다른 필드에 포함시킨다. coerce null인 필드값에 기본값을 넣어준다. strip 필드값의 좌우 공백을 제거한다. - mutate는 많은 옵션이 있어서 순서가 중요한데, coerce - rename - update - replace - convert - gsub - uppercase - capitalize - lowercase - strip - remove - split - join - merge - copy 순으로 옵션이 적용된다.
- message 필드 문자열이 공백을 기준으로 구분되어 배열 형태의 데이터가 되었다.
- 구분된 문자들은 '필드명[숫자]'와 같이 접근할 수 있다.
p. 234
- add_ field : 필드를 새로 만들어서 추가하는 옵션
- id라는 필드를 새로 생성하고 앞에서 split으로 분리되어 있는 message 필드의 배열 중에서 message[2]의 데이터를 넣는다.
- message[2]는 split 옵션에 의해 잘린 데이터 중 ID를 의미하는 필드다.
- remove_filed는 특정 필드를 삭제하는 옵션
필터 플러그인 공통 옵션
공통 옵션 설명 add_field 새로운 필드를 추가할 수 있다. add_tag 성공한 이벤트에 태그를 추가할 수 있다 enable_metric 메트릭 로깅을 활성화하거나 비활성화할 수 있다. 기본적으로 활성화되어 있으며, 수집된 데이터는 로그스태시 모니터링에서 해당 필터의 성능을 분석할 때 사용된다. id 플러그인의 아이디를 설정한다. 모니터링 시 아이디를 이용해 특정 플러그인을 쉽게 찾을 수 있다. remove_field 필드를 삭제할 수 있다 remove_tag 성공한 이벤트에 붙은 태그를 제거할 수 있다. p. 235
- id 필드를 추가하고 필드값은 message[2]를 사용, message 필드가 사라짐
- split이라는 필터 플러그인이 있는데 split 플러그인은 단일 문서를 복수의 문서로 나눠주는 역할을 한다. 지금 사용한 split은 mutate 플러그인의 옵션으로 둘을 혼동하지 않도록 주의
dissect 플러그인 - 문자열 파싱
- mutate 플러그인의 split 옵션 단점 : 하나의 구분자만 이용해서 데이터를 나눠야 함
- dissect 플러그인은 패턴을 이용해 문자열을 분석하고 주요 정보를 필드로 추출하는 기능 수행
- mapping 옵션 : 구분자 형태를 정의하고 필드를 구분한다.
- %{필드명} 으로 작성하면 중괄호({}) 안의 필드명으로 새로운 필드가 만들어진다.
- %{} 외의 문자들은 모두 구분자 역할을 한다.
- 필드를 구분하는 구분자로는 ''(공백) , '-', '[', ']' 가 있다.
ㅣ p. 237
- dissectfailure : dissect 필터 플러그인이 동작하지 않은 경우 발생한다.
- 매핑 패턴은 [timestamp]와 [id] 간의 공백이 한 칸이다.
- 두 번째 로그는 [timestamp]와 [id] 사이의 공백이 세 칸이기 때문에 매핑에서 정해놓은 구문자가 아니라며 오류를 발생
- dissect 플러그인에서는 공백 한 칸과 세 칸을 다르게 인식한다.
p. 238
- -> 기호는 공백을 무시한다.
- %{필드명->} 을 입력하면 공백이 몇 칸이든 하나의 공백으로 인식한다.
- %{?필드명} 혹은 %{}를 입력하면 그 필드명은 결과에 포함되지 않는다.
- %{?->} : 공백들을 하나의 필드로 만든 다음 무시하게 된다. 기존 level이나 message 필드도 모두 무시하게 된다.
- %{+필드명}을 작성하면 여러 개의 피드를 하나의 필드로 합쳐서 표현한다. 기존 port 피드가 ip 필드에 합쳐진다.
- [timestamp]와 [id] 사이에 있던 공백을 필드로 만든 후 공백 처리를 했다.
- ip와 port가 ip라는 하나의 필드로 변경되었고, level과 message 필드는 결과에 포함되지 않는다.
p. 239
grok를 이용한 문자열 파싱
- grok는 정규 표현식을 이용해 문자열을 파싱할 수 있다.
- 자주 사용하는 정규 표현식들을 패턴화해뒀으며 패턴을 이용해 %{패턴:필드명} 형태로 데이터에서 특정 필드를 파싱할 수 있다.
패턴명 설명 NUMBER 십진수를 인식한다. 부호와 소수점을 포함할 수 있다 SPACE 스페이스, 탭 등 하나 이상의 공백을 인식한다. URI URI를 인식한다. 프로토콜, 인증 정보, 호스트, 경로, 파라미터를 포함할 수 있다. IP IP 주소를 인식한다. IPv4나 IPv6를 모두 인식할 수 있다. SYSLOGBASE 시스로그의 일반적인 포맷에서 타임스탬프, 중요도, 호스트, 프로세스 정보까지 메시지 외의 헤더 부분을 인식한다. TIMESTAMP_IS08601 ISO8601 포맷의 타임스탬프를 인식한다. 2020-01-01T12:00:00+09:00과 같은 형태이며, 타임존까지 정확한 정보를 기록하고 로그에선 많이 쓰이는 날짜 포맷이기에 grok 표현식을 작성할 때도 유용하다 DATA 이 패턴의 직전 패턴부터 다음 패턴 사이를 모두 인식한다. 특별히 인식하고자 하는 값의 유형을 신경 쓸 필요가 없으므로 특별히 값이 검증될 필요가 없다면 가장 많이 쓰이는 패턴 중 하나다 GREEDYDATA DATA 타입과 통일하나, 표현식의 가장 뒤에 위치시킬 경우 해당 위치부터 이벤트의 끝까지를 값으로 인식한다. p. 240
- 원하는 패턴이 없는 경우 패턴을 직접 만들어 사용할 수 있다.
- grok는 기본적으로 %{패턴명:변수명} 형태로 작성하면 된다.
- TIMESTAMP_ISO8601 : ISO8601 표준 시간 표기법에 대한 패턴
- DATA : 모든 데이터를 인식
- IP : IPv4형태의 데이터를 인식한다.
- NUMBER : 숫자 인식. 변수명 뒤에 :int를 추가하면 변경시 정수 타입으로 지정한다.
- 특별한 값을 넣지 않으면 모든 데이터가 문자 타입으로 인식된다.
- LOGLEVEL은 시스로그(syslog) 레벨을 인식하낟.
- '[' , ']' , '-', '.' 같은 기호는 역슬래시(\)를 붙여 이스케이프할 수 있다.
- []* : 정규식을 이용해 모든 공백을 허용
- 날짜/ 시간 데이터 포맷은 로그 만드는 사용자가 너무나 다양한 형태로 포맷을 만들어서 사용하기 때문에 데이터를 수집하는 쪽에서 반드시 포맷을 통일
- TIMESTAMP_ISO8601 패턴은 연-월-일 형태의 포맷만 지원하기 때문에 pattern_definitions 옵션을 사용해 사용자가 패턴을 지정할 수 있다.
p. 243
- dissect, grok 플러그인은 패턴을 이용해 구문 분석을 한다는 공통점이 있지만 성능 차이가 있다.
- 로그 형식이 일정하고 패턴이 변하지 않는다면 dissect를 사용하는 것이 좋다. 패턴 분석을 하지 않아서 속도가 빠르기 때문이다.
- 로그 형태가 일정하다고 장담하기 힘들다면 예외 처리나 패턴이 자유로운 grok를 사용하는 것이 좋다.
대소문자 변경
- mutatue 플러그인의 uppercase 옵션을 통해 level 필드의 데이터를 모두 대문자로 변경한다
p. 244
날짜/시간 문자열 분석
- 로그 생성자들이 만드는 날짜/시간 포맷이 통일되어 있지 않다는 문제가 있다.
- 다양한 포맷을 date 플러그인을 이용해 기본 날짜/시간 포맷으로 인덱싱할 수 있다.
- 엘라스틱서치의 경우 ISO8601 표준 포맷(yyyy-MM-dd'T'HH:mm:ss.SSSSSZ. yyyy-MM-dd, epoch_millis)을 기본으로 사용
p. 245
- dissect 플러그인 : 문자열 자름 / timestamp 필드만 제외하고 나머지 필드는 무시한다.
- mutate 플러그인 : strip 옵션은 선택한 필드의 양 옆에 공백이 있을 경우 제거하는데, dissect에 의해 만들어진 timestamp 필드 좌우에 공백이 포함되어 있다면 제거된다.
- date 플러그인 : 날짜/시간 관련된 데이터를 ISO8601 타입으로 일괄적으로 변경
- match 옵션의 첫 번째 값은 매칭할 필드명이고 이후 값들은 매칭할 날짜/시간 포맷이다.
- target은 match에 의해 매칭될 필드가 저장될 새로운 필드를 의미
- timezone은 원본 문자열에 타임존 정보가 포함되어 있지 않을 때 어떤 타임존으로 분석할지 설정
- 로그스태시에서 사용하는 날짜/ 시간 포맷은 Joda Time 라이브러리 포맷을 사용
p.246
조건문
- 로그스태시에서는 일반적인 프로그래밍 언어와 동일한 형태로 if, else if, else 조건문을 제공하며, 이를 이용해 이벤트마다 적절한 필터를 적용
- if 조건문을 통해 필드명이 특정 조건과 일치하는지 확인하는데, level은 앞서 dissect에서 만들어진 필드다.
- 파이프라인 순서대로 동작하기 때문에 앞에서 level 필드가 만들어져야만 사용할 수 있다.
- drop은 데이터를 삭제하는 플러그인이다. 조건문과 결합하면 특정 조건을 만족하는 로그를 버릴 수 있다.
- level 이 "INFO" 였던 첫 번째 로그는 출력되지 않았다.
- level이 "warn"이었던 두 번째 로그는 mutate 플러그인에 의해 ip, port, timestamp, level 필드가 사라짐
p. 248
출력
- 파이프라인의 입력과 필터를 거쳐 가공된 데이터를 지정한 대상으로 보내는 단계
- 파이프라인의 마지막 단계
- 출력 플러그인
출력 플러그인 설명 elasticsearch 가장 많이 사용되는 출력 플러그인으로, bulk API를 사용해 엘라스틱 서치에 인덱싱을 수행한다. file 지정한 파일의 새로운 줄에 데이터를 기록한다. kafka 카프카 토픽에 데이터를 기록한다. - 결과를 엘라스틱서치로 전송할 것이므로 로그스태시를 실행하기 전에 엘라스틱서치를 먼저 실행해야 한다.
p. 248
- 2개의 출력 플러그인
- 파일형식 - path 옵션에 저장할 위치를 적어주면 된다.
- 엘라스틱서치전송 - 인덱스명을 설정할 수 있고 호스트 URL이나 라우팅 같은 다양한 옵션을 사용할 수 있다.
- 엘라스틱서치 플러그인 옵션
옵션 설명 hosts 이벤트를 전송할 엘라스틱서치의 주소 index 이벤트를 인덱싱할 대상 인덱스 document_id 인덱싱될 문서의 아이디를 직접 지정할 수 있는 옵션 user/password 엘라스틱서치에 보안 기능이 활성화되어 있을 때 인증을 위한 사용자 이름과 비밀번호 pipeline 엘라스틱서치에 등록된 인제스트 파이프라인을 활용하기 위한 옵션 template
template_name로그스태시에서 기본 제공되는 인덱스 템플릿 외에 커스텀 템플릿을 사용하기 위한 옵션.
template에는 정의한 인덱스 템플릿 파일의 경로를, template_name에는 엘라스틱서치에 어떤 이름으로 등록할지를 설정할 수 있다.p. 249
- 로그스태시를 실행할 때 --log.level 옵션을 error 로 지정하면 출력 로그를 볼 수 없으니 log.level 옵션은 사용하지 않도록 한다.
p. 250
코덱
- 입력/출력/필터와 달리 독립적으로 동작하지 않고 입력과 출력 과정에 사용되는 플러그인
- 입/출력 시 메시지를 적절한 형태로 변환하는 스트림 필터
- 입력과 출력 단계에서 데이터의 인코딩/디코딩을 담당한다.
- 입력과 출력에만 코덱을 사용하고 필터는 코덱을 사용할 수 없다.
- 코덱 플러그인
플러그인 설명 json 입력 시 JSON형태의 메시지를 객체로 읽어 들인다. 출력 시에는 이벤트 객체를 다시금 JSON 형태로 변환한다. plain 메시지를 단순 문자열로 읽어들인다. 출력 시에는 원하는 포맷을 지정할 수 있다. rubydebug 로그스태시이 설정을 테스트하거나 예기치 못한 파이프라인 설정 오류를 디버깅하기 위한 목적으로 주로 사용되며, 출력 시 루비 언어의 해시 형태로 이벤트를 기록한다. 입력시에는 사용되지 않는다. - 파일을 인코딩하지 못한 문제
- 입력 파일은 플레인 텍스트 형식인데 JSON 형식으로 인코딩을 시도했기 때문
- plain 코덱의 경우 굳이 명시하지 않아도 기본 적용
- 입력 코덱은 multiline 코덱을 많이 사용하는데 여러 라인 형태로 들어오는 로그를 하나의 로그로 만들기 위해 사용
- line : 텍스트 출력
- JSON : JSON 형태
- rubydebug : JSON 형태, 사용자가 읽기 쉽게 들여쓰기 까지 지원
- 표준 출력 플러그인에서 코덱을 따로 명시하지 않으면 기본으로 사용되는 코덱
p. 256
다중 파이프라인
- 하나의 로그스태시에서 여러 개의 파이프라인을 독립적으로 실행할 수 있게 한다.
- config - pipelines.yml 파일
'ELK Stack' 카테고리의 다른 글
비츠 - 설치 및 사용법 (0) 2022.06.26 엘라스틱서치 : 검색 (0) 2022.06.08 엘라스틱서치 기본 (0) 2022.05.29 엘라스틱서치 & 키바나 설치 (Window) (0) 2022.05.29 엘라스틱 스택 개요 (0) 2022.05.29