로그파이프라인(로그를 Logstash로)

문해피와 제육볶음·2023년 9월 11일
0

7월의 프로젝트

목록 보기
9/11

앞 포스팅에서 설명했듯이 로그가 파일의 형식으로 남게 됩니다.
이렇게 생성된 로그를 Logstash가 가져가 알맞은 형태로 맞추고 원하는 곳으로 output하게 됩니다.

Logstash에 관한 설명은 다음에 올리겠습니다.

Logstash에는 3가지의 단계로 구성이 됩니다.
1. input : 로그 또는 이벤트 데이터를 수집하는 부분입니다.
2. filter : 수집된 데이터를 처리하고 변환하는 부분입니다.
3. output : 처리된 데이터를 전송하는 부분입니다.

Logstash를 사용하게 된 이유는 분석가의 역할을하는 팀원이 어떤툴로 분석을 진행할지 정해지지 않은 상태였기 때문입니다.

  • BigQuery에 적재하면 BigQuery ML을 통해서 분석
  • ELK stack을 통해서 분석

그러면서 input과 output에는 다양한 플러그인을 지원하면서 유연하게 툴을 변경이 가능하다는 장점이 있었고, filter 플러그인을 사용하여 데이터 파싱, 필드 추가 및 제거, 변환 등 다양한 작업이 가능하여 Logstash를 사용하게 되었습니다.

🗒️ Logstash.conf

input {
  file {
    path => "파일 경로"
    start_position => "end"
    sincedb_path => "마지막 위치를 기록하는 파일의 경로"
  }
}

filter {
  grok {
    match => { "message" => "INFO,%{TIMESTAMP_ISO8601:log_timestamp},%{INT:user_id:int},%{DATA:action_data},%{GREEDYDATA:info}" } 
  }
  
  mutate {
    remove_field => [ "message", "log", "event", "@version", "host", "movie_rating", "@timestamp" ]
  }
}

output {

  kafka {
    codec => json
    bootstrap_servers => "브로커들의 IP와 PORT"
    topic_id => "토픽 이름"
  }

  if "search" in [info] or "movie_detail" in [info] {
    kafka {
      codec => json
      bootstrap_servers => "브로커들의 IP와 PORT"
      topic_id => "토픽 이름"
    }
  }
}

🦤 Input

  • input부분에서는 Django에서 생성되는 모든 로그파일에서 input되게 됩니다.

input의 형태를 file로 지정하고 파일의 경로와 start_position을 통해서 파일의 처음부터 할건지 아니면 마지막부터 할건지 정해야 합니다.
저는 서비스를 시작과 동시에 Logstash를 구동했기 때문에 end로 하였습니다.

TCP나 UDP로 하지않고 file로 한 이유는 로그파일을 10개가 넘어가게 된다면 삭제가 아닌 구글 스토리지로 가게되면서 로그파일을 장기적으로 보관하고 분석을 하기위해서 file로 로그파일을 남기면서 그것을 바로 가져오게 했습니다.

sincedb_path 부분은 파일에서 어디까지 읽었는지 추적하여 로그 데이터의 중복 처리를 방지하는 데 사용합니다.
그러면서 Logstash를 재시작하면 이전에 읽었던 위치에서 계속해서 로그를 읽을수 있습니다.

🦤 Filter

  • filter 부분에서는 로그 데이터를 분석하고 변환하는 작업이 이루어집니다.

grok

Grok은 원시 텍스트 데이터를 구조화된 데이터로 변환하기 위해 사용됩니다.

Grok 패턴은 %{SYNTAX:SEMANTIC} 형식으로 되어 있으며, SYNTAX 부분에는 정규표현식 이름이 들어가고 SEMANTIC 부분에는 해당 정규표현식에 일치하는 값이 할당될 필드 이름이 들어갑니다.

위 설정에서는 message 필드의 값을 분석하여 log_timestamp, user_id, action_data, info라는 네 개의 필드로 분리하고 있습니다.

mutate

Mutate를 사용해서 특정 필드를 추가하거나 삭제하는 등의 작업을 할 수 있습니다.
저는 remove_field를 통해서 output에서 stdout에 나왔던 필요없는 부분을 제거하였습니다.

🦤 Output

output은 메세지 큐를 미들웨어로 사용해서 다양한 데이터베이스나 스토리지로 로그데이터를 적재하는것을 목표로 하였습니다.
그중 카프카를 사용해서 가용성과 안정성을 높이는 결정을 하였습니다.

  • 모든 로그는 json형태로 user2라는 토픽으로 가게됩니다.
  • 그 중 info라는 key에 value가 search 또는 movie_detail 이라면 user3 토픽으로 가게됩니다.

0개의 댓글