DevOps/ELK

grok

게임이 더 좋아 2022. 12. 29. 23:26
반응형
728x170

Logstash 에서 제공하는 filter 플러그인

 

grok를 위해 아래 2가지 레퍼를 읽는 것이 좋음

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

https://grokdebugger.com/

 


 

문자열 포맷을 생각하면 이해하기 쉬움

${PATTERN:FIELD} 형태로 지정함

예시

logstash.conf
input {
   file {
      path => "C:/tpwork/logstash/bin/log/input.log"
   }
}
filter {
   grok {
      match => [
         "message", "%{LOGLEVEL:loglevel} -
            %{NOTSPACE:taskid} - %{NOTSPACE:logger} -
            %{WORD:label}( - %{INT:duration:int})?"
      ]
   }
   if [logger] == "TRANSACTION_START" {
      aggregate {
         task_id => "%{taskid}"
         code => "map['sql_duration'] = 0"
         map_action => "create"
      }
   }
   if [logger] == "SQL" {
      aggregate {
         task_id => "%{taskid}"
         code => "map['sql_duration'] ||= 0 ;
            map['sql_duration'] += event.get('duration')"
      }
   }
   if [logger] == "TRANSACTION_END" {
      aggregate {
         task_id => "%{taskid}"
         code => "event.set('sql_duration', map['sql_duration'])"
         end_of_task => true
         timeout => 120
      }
   }
}
output {
   file {
      path => "C:/tpwork/logstash/bin/log/output.log"   
   }
}​

 

 

input.log
INFO - 48566 - TRANSACTION_START - start
INFO - 48566 - SQL - transaction1 - 320
INFO - 48566 - SQL - transaction1 - 200
INFO - 48566 - TRANSACTION_END - end​

 

output.log
{
   "path":"C:/tpwork/logstash/bin/log/input.log","@timestamp": "2016-12-22T19:04:37.214Z",
   "loglevel":"INFO","logger":"TRANSACTION_START","@version": "1","host":"wcnlab-PC",
   "message":"8566 - TRANSACTION_START - start\r","tags":[]
}
{
   "duration":320,"path":"C:/tpwork/logstash/bin/log/input.log",
   "@timestamp":"2016-12-22T19:04:38.366Z","loglevel":"INFO","logger":"SQL",
   "@version":"1","host":"wcnlab-PC","label":"transaction1",
   "message":" INFO - 48566 - SQL - transaction1 - 320\r","taskid":"48566","tags":[]
}
{
   "duration":200,"path":"C:/tpwork/logstash/bin/log/input.log",
   "@timestamp":"2016-12-22T19:04:38.373Z","loglevel":"INFO","logger":"SQL",
   "@version":"1","host":"wcnlab-PC","label":"transaction1",
   "message":" INFO - 48566 - SQL - transaction1 - 200\r","taskid":"48566","tags":[]
}
{
   "sql_duration":520,"path":"C:/tpwork/logstash/bin/log/input.log",
   "@timestamp":"2016-12-22T19:04:38.380Z","loglevel":"INFO","logger":"TRANSACTION_END",
   "@version":"1","host":"wcnlab-PC","label":"end",
   "message":" INFO - 48566 - TRANSACTION_END - end\r","taskid":"48566","tags":[]
}​

 

grok에는 Built-in 패턴이 존재해서

모든 것에 대해 우리가 패턴을 직접 설정하지 않아도 됨

 

IP: matches an IP address
 
HOSTNAME: matches a hostname
 
USERNAME: matches a username
 
EMAILADDRESS: matches an email address
 
URI: matches a URI
 
URIPATH: matches a URI path
 
URIPARAM: matches a URI query parameter
 
DATE: matches a date
 
HTTPDATE: matches an HTTP-formatted date
 
INT: matches an integer
 
BASE10NUM: matches a base-10 number
 
NUMBER: matches any number
 
WORD: matches a word
 
QUOTEDSTRING: matches a quoted string
 
GREEDYDATA: matches any remaining text

 

 

 

 

 물론 WORD와 같은 표현 뿐만 아니라

정규식도 구현 가능함

 

정규 필터식 의미
\w 한 글자
\w+ 한 단어
\d 정수 1 자리
\d+ 정수 전체
\s 공백 한 칸
\s+ 공백 전체
\특수문자 특수 문자 구분

 

예를 들어 HTTPDATE를 정규식으로 뽑아내면 아래와 같음

\[%{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME}\]

 

 

 

(?<FIELD>SYNTAX)

grok {
    match => {
        "message" => "STR\:(?<str_field>\w+) INT\:(?<int_field>\d+)"
    }
}​

\w와 \d를 이용하여 문자 또는 숫자에 대한 패턴을 매칭함

예를 들어 아래와 같은 로그를 필터링 해보자

[2021-05-03T13:36:34,003][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>0.05}

grok {
    match => {
        "message" => "\[(?<year>\d+)\-(?<month>\d+)\-(?<day>\d+)T(?<hour>\d+)\:(?<minute>\d+)\:(?<second>\d+)\,(?<millisecond>\d+)\]\[(?<log_level>\w+\s+)\]\[(?<log_kind>\w+\.\w+\s+)\]\[(?<log_class>\w+)\] %{GREEDYDATA:log_info}"
    }
}

또한 패턴에 많이 쓰이는 GREEDYDATA가 있다.

GREEDYDATA - 모든 남아 있는 데이터와 일치하는 패턴이란 뜻

 


 

참고 링크

https://www.elastic.co/kr/blog/a-practical-introduction-to-logstash

https://m.blog.naver.com/brilliantjay/221346745139

https://ksr930.tistory.com/104

반응형
그리드형

'DevOps > ELK' 카테고리의 다른 글

Elasticsearch  (2) 2023.04.01
Logstash vs Filebeat  (0) 2023.01.04
Filebeat Tutorial, 파일비트 튜토리얼  (0) 2022.12.29
ELK, Elasticsearch+Logstash+Kibana  (0) 2022.12.29
Logstash Tutorial, 로그스태시 튜토리얼  (2) 2022.12.29