본문 바로가기
DevOps

Nginx 로그를 패턴 매칭해서 AWS Elasticsearch에 저장하기

by 헬로월드 2021. 10. 15.
반응형

Nginx로그를 Filebeat으로 수집할때 Filebeat에 Nginx Mode가 있어 자동으로 패턴을 분석해줍니다.

하지만 OSS버전의 Filebea로는 잘 적용되지 않았습니다.

 

그래서 Filebeat로그를 Logstash로 받아 Logstash에서 패턴을 매칭한다음 AWS Elasticsearch에 저장했습니다.

 

우선 Filebeat 설정을 OSS Logstash에 맞게 변경해줍니다.

아래는 제 filebeat.yml 예시입니다. 

logging.metrics.enabled: false

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - '/var/log/nginx/access.log*'
  fields:
    server_name: nginx
    log_type: nginx
  fields_under_root: true

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

output.logstash:
  hosts: ["my logstash url:5044"]

setup.ilm.enabled: false
setup.ilm.check_exists: false
setup.template.settings:
  index.number_of_shards: 1

 

다음으로 Logstash 에 필터를 넣어 줍니다.

저는 'log_type'이라는 custom filed를 넣어주고 구분을 했습니다.

filter {
 if [log_type] == "nginx" {
  grok {
   match => {
    "message" => ["%{IPORHOST:clientip} (?:-|(%{WORD}.%{WORD})) %{USER:ident} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:client-agent} %{QS:forwarder}"]
   }
  }
 }
}

 

 

 

 

아래는 logstash.conf 전체 예시 입니다.

input {
 tcp {
  port => 5000
  codec => json_lines
 }
 beats {
  port => 5044
 }
}

filter {
 if [log_type] == "nginx" {
  grok {
   match => {
    "message" => ["%{IPORHOST:clientip} (?:-|(%{WORD}.%{WORD})) %{USER:ident} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:client-agent} %{QS:forwarder}"]
   }
  }
 }
}

output {
 if [log_type] and [server_name]{
  elasticsearch {
   hosts => ["https://aws-elasticsearch-url.ap-northeast-2.es.amazonaws.com:443"]
   ssl => true
   index => "log-%{[server_name]}-%{[log_type]}-%{+YYYY.MM.dd}"
   user => ""
   password => ""
   ilm_enabled => false
   manage_template => false
  }
 } else if [appname] and [profile]{
  elasticsearch {
   hosts => ["https://aws-elasticsearch-url.ap-northeast-2.es.amazonaws.com:443"]
   ssl => true
   index => "log-%{[appname]}-%{[profile]}-%{+YYYY.MM.dd}"
   user => ""
   password => ""
   ilm_enabled => false
  }
 } else {
  elasticsearch {
   hosts => ["https://aws-elasticsearch-url.ap-northeast-2.es.amazonaws.com:443"]
   ssl => true
   index => "logstash-%{+YYYY.MM.dd}"
   user => ""
   password => ""
   ilm_enabled => false
  }
 }
}
728x90