인프라,데이터/Elasticsearch, Logstash, Kibana

Logstash 7.16.2 버전에서 로그 파싱하기

AimB 2021. 12. 30. 22:19
{"svctype":"test-svc-type","instance_name":"test-instance_ip-0.0.0.0", "@timestamp":"2021-12-30T12:30:06.731Z","environment":"test","role":"api","filename":"test.log","@version":"1","message":"* 2021-12-30 21:30:06,690 test log message","host":"ip-0.0.0.0.ap-northeast-2.compute.internal","team":"test"}

위와 같은 로그가 있다.

각 서버에서 위와 같은 로그를 받아와, 로그스태시에 input 형태로 넣고, SQS로 아웃풋을 보낸다.

중요한 것은 설정 파일에서 

input {
  file {
    path => "/usr/share/logstash/data/*.log"
    start_position => "beginning"
    codec => "json"
  }
}
output {
  stdout { }
  sqs {
    access_key_id => "***"
    secret_access_key => "****"
    codec => "json"
    queue => "test_queue"
    region => "ap-northeast-2"
    }
}

codec => "json" 을 해야 위의 로그가 다음과 같은 형태로 잘 파싱된다는 점에 있다. 

이걸 모르고 로그 자체가 제대로 파싱이 안되어서 한참 삽질했다..

{
         "filename" => "test.log",
          "message" => "* 2021-12-30 21:30:06,690 test log message",
          "svctype" => "test-svc-type",
         "@version" => "1",
       "@timestamp" => 2021-12-30T12:30:06.731Z,
             "path" => "/usr/share/logstash/data/test.log",
             "team" => "test",
             "host" => "ip-0.0.0.0.ap-northeast-2.compute.internal",
             "role" => "api",
      "environment" => "test",
    "instance_name" => "test-instance_ip-0.0.0.0"
}

 

첫번째 로그스태시를 거치면 로그가 이렇게 아름답게 파싱되지만, 단계가 더 남았다.

여러 서버를 가동할 경우 각 서버의 로그를 다 모아서 편히 볼 수 있도록,
콜렉터 역할을 하는 로그스태시 하나를 더 실행해 SQS에서 로그를 받아온다.

input {
    sqs {
        codec => "json"
        queue => "test_queue"
        region => "ap-northeast-2"
        threads => 8
        polling_frequency => 1
        access_key_id => "****"
        secret_access_key => "****"
    }
}
filter {
    grok {
      patterns_dir => ["/etc/logstash/patterns"]
      match => { "message" => "%{TEST}" }
      keep_empty_captures => true
    }
    mutate {
      remove_field => ["message"]
    }
  }
}
output {
    elasticsearch {
        index => "test-log-%{+YYYY-MM-dd}"
        hosts => ["127.0.0.1:9200"]
        }
     }
 }

그리고 로그 메시지도 예쁘게 한번 더 파싱해줘야 한다.

두번째 로그스태시의 설정 파일에서

          "message" => "* 2021-12-30 21:30:06,690 test log message",

이 메시지를 grok으로 파싱하도록 filter 설정을 해준다.

patterns_dir 파일 밑에 test 파일을 생성해

APPDATE %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}
TEST ^\* %{APPDATE:time_local} %{GREEDYDATA:log_message}

을 만들어준다. 패턴은 로그 메시지 형태에 따라 바꾸면 된다.

output을 엘라스틱서치나 S3으로 쏴주면 로그를 키바나에서 간편하게 확인할 수 있다.