소행성이야기

Logstash를 사용하여 Apache 로그를 분석

소행성왕자 2018. 7. 10. 15:17

Logstash를 사용하여 Apache 로그를 분석


제일 먼저 해야할 할 가장 중요하고 일반적인 단계 중 하나는 Apache 로그를 향상시키는 것입니다.

이것은 Kibana에서 로그를보다 이해하고 분석 할 수 있도록 로그를 구문 분석하도록 Logstash 필터를 구성하는 것과 관련이 있습니다.

다음은 Apache 로그 라인과 본인 환경에서 이러한 로그를 구문 분석하는 데 사용하는 Logstash 구성의 예입니다.

1
2
3
 
httpd.conf common 설정
"%h %l %u %t \"%{uniqueid}i\" \"%r\" %>s %b"
cs


샘플 Apache 액세스 로그 항목 

1
2
 
192.168.0.34 - - [10/Jul/2018:14:15:41 +0900"W0RA-bdd2MEYBj@0ozrTWAAAAAc" "POST /Air/Reservation/AjaxList HTTP/1.1" 200 6864
cs


해당 Apache 액세스 로그 항목을 구문 분석하는 Logstash 구성


1
2
3
4
5
6
7
8
filter {
  grok {
    match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{NOTSPACE:transaction_id}\" \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:-|%{NUMBER:bytes})"}
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}
cs


conf file 을 기반으로 작업이 수행되기 때문에 유효한지를 검사 -t 옵션 사용

1
/bin/logstash --f ./prime-main.conf
cs


실행 (root 로 실행 why? 아파치 access_log 접근권한 때문에)

1
/bin/logstash -f ./prime-main.conf
cs

아래와 같이 정상적으로 출력 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
        "@timestamp" => 2018-07-10T06:02:12.000Z,
          "clientip" => "192.168.0.34",
             "ident" => "-",
         "timestamp" => "10/Jul/2018:15:02:12 +0900",
             "bytes" => "1077",
    "transaction_id" => "W0RL5Ldd2MEYBj@0ozrTWQAAAAc",
              "host" => "localhost.localdomain",
              "auth" => "-",
       "httpversion" => "1.1",
           "message" => "192.168.0.34 - - [10/Jul/2018:15:02:12 +0900] \"W0RL5Ldd2MEYBj@0ozrTWQAAAAc\" \"GET /erp/zones/images/air/SC.gif HTTP/1.1\" 200 1077",
            "method" => "GET",
              "path" => "/var/log/httpd/naya-access_log",
          "@version" => "1",
           "request" => "/erp/zones/images/air/SC.gif",
          "response" => "200"
}
{
        "@timestamp" => 2018-07-10T06:02:18.000Z,
          "clientip" => "::1",
             "ident" => "-",
         "timestamp" => "10/Jul/2018:15:02:18 +0900",
    "transaction_id" => "-",
              "host" => "localhost.localdomain",
              "auth" => "-",
       "httpversion" => "1.0",
           "message" => "::1 - - [10/Jul/2018:15:02:18 +0900] \"-\" \"OPTIONS * HTTP/1.0\" 200 -",
            "method" => "OPTIONS",
              "path" => "/var/log/httpd/naya-access_log",
          "@version" => "1",
           "request" => "*",
          "response" => "200"
}
cs


참고로 logstash 로그 grok 정규식 확인하는 사이트 

http://grokdebug.herokuapp.com/


나머지는 키바나에서 확인하시면 되실겁니다.


Logstach config/prime-main.conf 전체 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
input {
  file {
    path => "/var/log/httpd/naya-access_log"
    start_position => "beginning"
  }
}
 
filter {
  grok {
    match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{NOTSPACE:transaction_id}\" \"%{WORD:method} %{DATA:request} HTTP/%{N
UMBER:httpversion}\" %{NUMBER:response} (?:-|%{NUMBER:bytes})"}
  }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}
 
output {
  elasticsearch {
        hosts => ["localhost:9200"]
        index => "apache--%{+YYYY.MM.dd}"
  }
  stdout {
        codec => rubydebug
  }
}
cs