back-end/Monitoring

로그 파일 Logstash + ElasticSearch와 연동 (Docker)

icandle 2024. 11. 18. 22:47

Logstash → ElasticSearch 데이터 플로우

  • 로그 파일 생성:
    • 애플리케이션(Nginx, Django 등)이 로그 파일을 생성한다.
    • 예: service.log 파일에 JSON 형식으로 로그가 기록됨.
  • Logstash 입력 단계 (Input):
    • Logstash가 로그 파일을 모니터링한다.
    • 로그 파일이 업데이트되면 데이터를 읽어온다.
    • Input Plugin: file, tcp, http 등 다양한 입력 소스를 지원한다.
  • Logstash 필터링 단계 (Filter):
    • 읽어온 데이터를 정제하고 가공한다.
    • 예: 로그에서 불필요한 필드를 제거하거나, 새로운 필드를 추가한다.
    • Filter Plugin: grok, mutate, date 등을 사용해 데이터 처리.
  • Logstash 출력 단계 (Output):
    • 처리된 데이터를 ElasticSearch로 전달한다.
    • Output Plugin: elasticsearch, file, stdout 등 지원.
  • ElasticSearch 저장:
    • Logstash가 전달한 데이터를 ElasticSearch에 저장한다.
    • 데이터는 **인덱스(Index)**에 저장되며, 검색과 분석에 사용된다.
  • 검색 및 시각화:
    • 사용자는 ElasticSearch API 또는 Kibana를 통해 데이터를 검색하고 분석한다.
    • 예: 특정 시간 범위의 에러 로그를 검색하거나 응답 시간 통계를 확인.

Logstash가 로그 파일을 감지하는 원리

Logstash Input Plugin (file)

  • Logstash의 file 입력 플러그인은 지정된 로그 파일을 지속적으로 모니터링한다.
  • 새로운 로그가 추가되면 해당 내용을 읽어서 처리한다.
  • 로그 파일의 읽은 위치를 **"시작 포인터 (sincedb)"**에 저장해, 로그 파일을 다시 읽는 일이 없도록 관리한다.

 

ElasticSearch 설치 및 실행

#network 생성
docker network create elastic

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.16.0
docker run -d --name elasticsearch --net elastic \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  docker.elastic.co/elasticsearch/elasticsearch:8.16.0

 

http://localhost:9200/

응답 결과

 

LogStash 설치 및 실행

docker pull docker.elastic.co/logstash/logstash:8.16.0

 

원하는 경로에 logstash.conf 설정 파일을 생성 및 작성한다.

input {
  file {
    path => "/d/projects/example/src/logs/service.log.*"  # 날짜별 로그 파일 경로 (와일드카드 사용)
    start_position => "beginning"          # 처음부터 읽기
    sincedb_path => "/dev/null"            # 중복 읽기 방지 비활성화
    codec => json                          # JSON 로그를 자동으로 파싱
  }
}

filter {
  # "timestamp" 필드를 Logstash의 @timestamp 필드로 변환
  date {
    match => ["timestamp", "ISO8601"]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]  # ElasticSearch 주소
    index => "service-logs-%{+YYYY.MM.dd}"  # 날짜별 인덱스 생성
  }
  stdout {
    codec => rubydebug                  # 디버깅용 출력
  }
}

 

Logstash.conf 분석

  1. 파일 경로 설정:
    • path => "/d/projects/example/src/logs/service.log.*":
      • 날짜별 로그 파일을 지정하기 위해 와일드카드(*) 사용
      • 여러 날짜 로그 파일을 처리 가능.
  2. 필터:
    • date 필터는 로그 내부의 "timestamp" 필드를 읽어 @timestamp로 변환.
    • ElasticSearch는 기본적으로 @timestamp를 기준으로 데이터를 처리한다.
  3. 출력 (output):
    • index => "service-logs-%{+YYYY.MM.dd}":
      • 로그의 @timestamp 기준으로 날짜별 인덱스 생성.
      • 예: 2024년 11월 18일 로그는 service-logs-2024.11.18이라는 인덱스로 저장.

Logstash 실행하기

  • -v /d/projects/study/logstash_config:/usr/share/logstash/config : 설정 파일을 컨테이너 내부로 마운트.
  • -v /d/projects/example/src/logs:/usr/share/logstash/logs: 로그 파일을 마운트.
docker run -d --name logstash --net elastic \
  -v /d/projects/study/logstash_config:/usr/share/logstash/config \
  -v /d/projects/example/src/logs:/usr/share/logstash/logs \
  docker.elastic.co/logstash/logstash:8.16.0

 

ElasticSearch 인덱스로 로그 조회 확인 방법

curl -X GET http://localhost:9200/service-logs-2024.11.18/_search?pretty