2023년 6월 3일 토요일

Common vs Combined

아파치 로그는 Common과
147.229.9.14 - - [28/May/2022:16:52:07 +0000] "GET /images/jordan-80.png HTTP/1.1" 304 45

Combined 포맷의 로그로 나뉜다.
147.229.9.14 - - [28/May/2022:16:52:07 +0000] "GET /images/jordan-80.png HTTP/1.1" 304 45 "http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/" "Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0"

이때 Common 로그는 grok 정규표현식 패턴인 COMMONAPACHELOG로
filter {
 grok {
  match => {"message" => "%{COMMONAPACHELOG}"}
 }
}
[2023-06-03T16:17:08,979][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
          "ident" => "-",
      "timestamp" => "28/May/2022:16:52:07 +0000",
       "clientip" => "147.229.9.14",
          "bytes" => "45",
           "verb" => "GET",
        "request" => "/images/jordan-80.png",
       "response" => "304",
        "message" => "147.229.9.14 - - [28/May/2022:16:52:07 +0000] \"GET /images/jordan-80.png HTTP/1.1\" 304 45\r",
    "httpversion" => "1.1",
           "auth" => "-"
}

Combined 로그는 grok 정규표현식 패턴인 COMBINEDAPACHELOG로 기본 테이블 구조를 완성할 수 있다.
filter {
 grok {
  match => {"message" => "%{COMBINEDAPACHELOG}"}
 }
}
[2023-06-03T16:18:52,957][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
          "ident" => "-",
          "bytes" => "45",
       "clientip" => "147.229.9.14",
          "agent" => "\"Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0\"",
        "request" => "/images/jordan-80.png",
       "referrer" => "\"http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/\"",
      "timestamp" => "28/May/2022:16:52:07 +0000",
           "verb" => "GET",
       "response" => "304",
        "message" => "147.229.9.14 - - [28/May/2022:16:52:07 +0000] \"GET /images/jordan-80.png HTTP/1.1\" 304 45 \"http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/\" \"Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0\"\r",
    "httpversion" => "1.1",
           "auth" => "-"
}

그런데 COMBINEDAPACHELOG 패턴 실행 결과를 보면 agent, referrer 필드값의 인용부호(")가 사라지지 않음을 알 수 있다. 물론 해당 인용부호가 데이터 활용에 크게 영향을 주지는 않는다. 그냥 좀 거슬릴뿐(..)

인용부호를 제거하고 싶다면

보통은 dissect로 대충 자르고, grok로 다듬는 편인데 오늘은 좀 다르게 해보자. 커스텀 grok 정규표현식 패턴 준비.

filter {
 grok {
  patterns_dir => "d:/myregex.txt"
  match => {"message" => "%{COMBINEDAPACHELOG}"}
 }
}
[2023-06-03T16:25:35,705][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
     "clientip" => "147.229.9.14",
        "bytes" => "45",
    "timestamp" => "28/May/2022:16:52:07 +0000",
        "agent" => "Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0",
       "method" => "GET",
     "referrer" => "http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/",
          "uri" => "/images/jordan-80.png",
      "message" => "147.229.9.14 - - [28/May/2022:16:52:07 +0000] \"GET /images/jordan-80.png HTTP/1.1\" 304 45 \"http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/\" \"Mozilla/5.0 (Windows NT 5.1; rv:27.0) Gecko/20100101 Firefox/27.0\"\r",
       "status" => "304"
}

아니면 내장된 grok 정규표현식 사용 후, 인용부호 제거 과정을 추가하거나
filter {
 grok {
  match => {"message" => "%{COMBINEDAPACHELOG}"}
 }

 dissect {
  mapping => {"agent" => '"%{agent}"'}
  mapping => {"referrer" => '"%{referrer}"'}
 }
}

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스