logstash로 Datadog으로 로그를 전송하고, 전송된 로그를 Querying해 Visualization해보도록 한다.
Logstash
여러 곳(Source)의 데이터를 수집 / 통합시켜 지정한 곳(Destination)으로 전송하는 데이터 처리 파이프라인 도구이다.
데이터를 수집, 분석하고 정제하는 ETL(Extract, Transform, Load) 도구이며, 엘라스틱서치의 3스택(ElasticSearch, Logstash, Kibana)중 하나의 요소로 알려져 있다.
로그스태시의 파이프라인 구성파일은 크게 입력(input), 정제(filter), 출력(output)의 3개의 파트로 나누어져 있다.
이와 같은 Logstash의 또다른 특징으로 파이프라인의 각 파트별로 플러그인을 제공해 다양한 상황에서 편리하게 사용하도록한다.
Datadog에서는 로그데이터 수집을 위해 Logstash output plugin을 제공하고 있다.
logstash로 Datadog에 로그 전송 Setting
Datadog API Key 생성
Organization Settings > Access > API Keys에서 API Key를 생성한다.
Logstash 설치
Logstash는 바이너리 설치와 패키지를 통한 설치 2가지를 모두 지원한다.
이 글에서는 Ubuntu에 패키지 설치로 진행한다.
아래 다운로드 링크에서 패키지를 다운로드 링크를 받는다.
설치할 서버에 패키지 다운로드 후, dpkg로 설치를 진행한다.
# 패키지 다운로드
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.10.4-amd64.deb
# 패키지 설치
dpkg -i logstash-8.10.4-amd64.deb
Logstash Output Plugin 설치
Datadog에서는 로그데이터 수집을 위해 Logstash output plugin을 제공하고 있다.
패키지로 설치한 경우, /usr/share/logstash에 설치되며, 플러그인을 설치할 수 있는 logstash-plugin을 찾아볼 수 있다.
Logstash를 설치한 서버에 다음 커맨드로 Datadog output 플러그인을 설치한다.
logstash-plugin install logstash-output-datadog_logs
Logstash 파이프라인 설정(.conf)
Logstash를 시작하기에 앞서 Logstash를 통하는 로그의 흐름, 파이프라인에 대한 설정을 해주어야 한다.
위에서 서술했듯이, Logstash의 파이프라인 설정파일은 3가지 파트로 구성되어있다.
우리는 웹 로그를 Datadog으로 전송하려고 한다. 즉, input은 웹 로그파일, output은 방금 설치한 Datadog output을 지정해주는 것이다.
input {
file {
path => "/var/log/apache2/access.log"
start_position => "beginning"
tags => ["logstash_demo"]
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
datadog_logs {
api_key => "[API Key 입력]"
}
stdout {
codec => rubydebug
}
}
파이프라인 설정파일에 대한 내용과 setting 값들에 대해서 이 글에서는 자세히 다루지 않는다.
집중적으로 바라볼 내용은 output 구문에 있는 방금 설치한 datadog_logs 플러그인이 사용된 부분이다.
파이프라인 설정파일의 경로는 /etc/logstash/pipeline.yml에 작성된 path.config로 지정된다.
별도로 지정하지 않은 경우, 기본 위치는 /etc/logstash/conf.d 이하로 설정된다.
전송된 로그 데이터 확인
설정 후 Logstash를 시작하면 작성한 파이프라인 설정파일이 적용되어 input-filter-output이 연결, Datadog으로 Logs 메뉴에서 로그데이터가 전송되는 것을 확인할 수 있다.
(systemctl로 Logstash를 시작하는 경우, Logstash systemd의 기본 User가 root가 아니므로 apache 로그를 읽을 수 없음)
./bin/logstash -f [파이프라인 설정파일 경로]
Datadog Querying
이렇게 Datadog으로 전달된 로그들은 원하는 내용만 뽑아볼 수 있도록 Querying이 필요하다.
Datadog의 log는 list, timeseries, top list, chart 등 다양한 visualization을 제공한다.
Logs 메뉴의 상단에서 쿼리문을 작성할 수 있다.
Indexing된 데이터는 Attribute로 필터링해 Querying이 가능하다. 각 Attribute 앞에 "@"을 붙여서 검색을 한다.
예시로 전달된 apache 웹 로그 format(grok 플러그인의 COMBINEDAPACHELOG 패턴)에서 Indexing된 Attribute 중 하나인 접근 URL path를 기준으로 특정 path로 접근한 로그를 필터링하는 구문을 작성해본다.
@url.original: /admin*
Term 외에도 Operator(연산자) 개념이 존재한다. 쿼리 필터문으로 지원하는 연산자는 아래 3개와 같다.
Operator | 설명 | 예시 |
AND | 교집합 연산, 연산자를 사용하지 않으면 기본적으로 AND 연산 | @ip:1.2.3.4 AND @status_code:200 |
OR | 합집합 연산 | @httpRequest.uri:(*api* OR *auth*) |
- | 여집합 연산, NOT 연산 | -@ip: 1.1.1.1 |
연산자를 활용해 로그를 필터링하는 몇 가지 예시와 쿼리로 알아보도록 한다.
예시 1) User-Agent가 Firefox인 것 중, 응답코드가 200인 로그만 필터링
@user_agent.original:*Firefox* @http.response.status_code:200
예시 2) 접속 IP가 192.168.245.1을 제외한 로그 중, /img 이하 path에 접근한 로그만 필터링
-@source.address:192.168.245.1 @url.original:/img*
예시 3) 접속 Path가 /page.html인 로그 중, 응답코드가 400번대인 로그만 필터링
@ uri.original:/page.html* @http.response.status_code:[400 TO 499]
이렇게 직접 쿼리문을 작성하는 것 이외에도 로그 항목에서 필터링을 해줄 수도 있다.
로그 목록에서 로그를 클릭하면 해당 로그에 대해 Attribute와 Value가 우측 사이드바로 나타난다. 여기서 Attribute에 톱니바퀴 아이콘을 클릭하면 해당 로그의 Attribute에 대해 할 수 있는 작업들 목록이 나온다.
주요한 Action 내용은 아래와 같다.
- Filter by ~ : 해당 Attribute와 Value를 필터링 (쿼리문에 삽입)
- Exclude ~ : 해당 Attribute와 Value를 제외한 값을 필터링 (쿼리문에 '-'이 붙은 상태로 삽입)
- Replace filter with ~ : 해당 Attribute와 Value만 필터링 (기존 쿼리문의 내용 삭제 후, 해당 Attribute만 삽입)
쿼리문 작성과 관련된 공식 Docs는 아래와 같다.
다음은 Querying 한 로그들을 대시보드로 넣어 관리하는 방법을 알아본다.