반응형
728x170
Logstash 에서 제공하는 filter 플러그인
grok를 위해 아래 2가지 레퍼를 읽는 것이 좋음
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
문자열 포맷을 생각하면 이해하기 쉬움
${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
728x90
반응형
그리드형
'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 |