2024년 1월 21일 일요일

Logstash와 ECS

버전 8부터는 로그스태시에도 ECS(Elastic Common Schema)가 기본 적용된다.


다음은 기본 설정으로 데이터를 연동한 결과.
filter {
 grok {
  match => {"message" => "%{COMMONAPACHELOG}"}
 }
}
[2024-01-21T13:06:04,967][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
           "url" => {
        "original" => "/bbs/view.php?board_id=kor%5Fmedia&gul_no=1106&idx=17&m=4&upage=25&tpage=&PAGE=4"
    },
         "event" => {
        "original" => "192.168.71.168 - - [12/Oct/2015:02:42:00 +0900] \"GET /bbs/view.php?board_id=kor%5Fmedia&gul_no=1106&idx=17&m=4&upage=25&tpage=&PAGE=4 HTTP/1.1\" 200 37727\r"
    },
          "host" => {
        "name" => "MHKANG"
    },
           "log" => {
        "file" => {
            "path" => "d:/test.log"
        }
    },
     "timestamp" => "12/Oct/2015:02:42:00 +0900",
      "@version" => "1",
       "message" => "192.168.71.168 - - [12/Oct/2015:02:42:00 +0900] \"GET /bbs/view.php?board_id=kor%5Fmedia&gul_no=1106&idx=17&m=4&upage=25&tpage=&PAGE=4 HTTP/1.1\" 200 37727\r",
          "http" => {
         "version" => "1.1",
        "response" => {
                   "body" => {
                "bytes" => 37727
            },
            "status_code" => 200
        },
         "request" => {
            "method" => "GET"
        }
    },
    "@timestamp" => 2024-01-21T04:06:05.015484800Z,
        "source" => {
        "address" => "192.168.71.168"
    }
}

'부모-자식' 구조의 ECS 규격 필드가 추가됨을 알 수 있다. 문제는 내장된 grok 필터 정규표현식을 제외한, 사용자 커스터마이징이 적용된 데이터 전처리 과정에서는 ECS가 적용되지 않는다는 것.  

ECS가 데이터 성격에 맞게 통일된 필드 정의를 자동으로 해주는 건 좋은데, 아직까지는 유용한지 잘 모르겠다. 일단 데이터를 잘 모르는 상태에서 남이 만들어준 스키마는 낯설 수밖에 없고, 데이터를 잘 안다면 내가 만든 스키마가 분석하기 제일 편하니까.

ECS disable

[2024-01-21T13:15:56,786][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "httpversion" => "1.1",
     "@timestamp" => 2024-01-21T04:15:56.835027700Z,
           "verb" => "GET",
       "response" => "200",
           "path" => "d:/test.log",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "12/Oct/2015:02:42:00 +0900",
       "@version" => "1",
           "host" => "MHKANG",
       "clientip" => "192.168.71.168",
          "bytes" => "37727",
        "message" => "192.168.71.168 - - [12/Oct/2015:02:42:00 +0900] \"GET /bbs/view.php?board_id=kor%5Fmedia&gul_no=1106&idx=17&m=4&upage=25&tpage=&PAGE=4 HTTP/1.1\" 200 37727\r",
        "request" => "/bbs/view.php?board_id=kor%5Fmedia&gul_no=1106&idx=17&m=4&upage=25&tpage=&PAGE=4"
}

참고로 ECS 기능을 사용하면 인덱스 대신 logs-generic-default란 Data stream이 만들어진다.


물론 인덱스가 진짜 없는 건 아니고, 숨겨진 인덱스가 해당 Data stream에 연결됨.


Data stream은 ILM(Index Lifecycle Management)에 의해 분기되는 인덱스의 읽기/쓰기 구분을 자동으로 처리해주며, 엘라스틱 스택이 아닌 (별도 개발한) 애플리케이션으로 읽기/쓰기 인덱스를 구분해야할 때 aliases 수작업의 번거로움을 없애준다.

하지만 별도 애플리케이션을 사용하지 않는다면 Data stream의 장점을 느끼기 힘들다. ILM 자동 연동 정도? 이때 Data Stream을 사용하고 싶지 않다면 역시 ECS disable. 또는 인덱스 이름 직접 지정.

관련 글

댓글 없음:

댓글 쓰기

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