이번엔 작업중 해결했던 문제점을 정리하려고 한다.
일단 기본적으로 제공하는 다양한 패턴이 있다.
[기본_제공되는 grok패턴 확인 링크]
링크를 확인하여 grok 패턴으로 사용할 수 있다.
grok {
match => {
"message" => [
"%{GREEDYDATA:ALL}"
]
}
}
ALL이라는 필드로 모든데이터가 쌓인 필드 생성된다.
MY_DATE_PATTERN %{MONTHDAY}-%{MONTH}-%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
DATE_PATTERN_2 %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
MY_LOGLEVEL \b(?:정보?|심각?|경고)\b
ACCES_DATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{HOUR}:?%{MINUTE}(?::?%{SECOND})
사용할 패턴들 명시한다.
grok {
patterns_dir => ["/dir/pattern_zip"]
match => {
"message" => [
"\(%{GREEDYDATA:java_line}\) %{DATE_PATTERN_2:log_date} : %{GREEDYDATA:function_1} : %{GREEDYDATA:function_2_unit}",
"\(%{GREEDYDATA:java_line}\) %{DATE_PATTERN_2:log_date} : %{GREEDYDATA:function_1}"
]
}
}
참고자료) grok패턴 적용 정리 블로그
참고자료) 사용자 grok 패턴 적용 정리 블로그
참고자료) grok 패턴 적용
@timestamp는 색인에 데이터가 쌓이는 시간으로 만들어지기 때문에 로그가 생성된 시간으로 시각화 그래프를 보기 힘들다.
2024-04-23 23:29:41.336
[23/Apr/2024:00:00:01 +0900]
이렇게 로그에 찍히는 다양한 시간패턴으로 @timestamp 를 대체할 필드를 만들자
filter {
grok {
patterns_dir => ["/dir/pattern_zip"]
match => { "message" => "%{MY_DATE_PATTERN:log_date} %{MY_LOGLEVEL:log_level}" }
}
date {
match => [ "log_date", "YYYY-MM-dd HH:mm:ss.SSS", "YYYY-MM-dd HH:mm:ss,SSS","dd/MMM/yyyy:HH:mm:ss" ]
target => "log_time"
}
}
date filter도 패턴을 체크하는것이기 때문에 날짜 형식이 패턴이랑 맞아야함
2024-02-13 11:22:13.123 => YYYY-MM-dd HH:mm:ss.SSS
2024-02-13 11:22:13,123 => YYYY-MM-dd HH:mm:ss,SSS
23/Apr/2024:00:00:01 => dd/MMM/yyyy:HH:mm:ss
나는 ","를 "."로 봐서 패턴이 매칭이 안되서 왜 안되지ㅠㅠ 시간을 많이 보냈다..
es date filte 공식문서_More details on the syntax부분 확인하여 시간 패턴 체크
참고자료) date filter 사용하기 -1
참고자료) date filter 사용하기 -2
2024-04-11 INFO(공백1)tomcat...
2024-04-11 INFO(공백2)tomcat...
로그레벨 뒤 공백이 하나만 오는 패턴이라고 생각했는데 어떤경우는 공백이 두번 들어가는게 있어서 패턴에서 캡쳐가 되지 않는 문제 확인!
\(%{GREEDYDATA:java_line}\) %{DATE_PATTERN_2:log_date} : %{GREEDYDATA:function_1}\s*(?: : %{GREEDYDATA:function_2_unit})?
위의 패턴처럼 \s* 을 사용하면 n개의 공백으로 체크함
grok{
match => {
"message" => [
"\(%{GREEDYDATA:java_line}\) %{DATE_PATTERN_2:log_date} : " ]
}
break_on_match => true
}
grok {
match => {
"message" => [
"%{DATE_PATTERN_2:log_date}\s+"
]
}
break_on_match => true
}
grok filter 두번 넣어주기.
grok {
match => {
"message" => [
"%{DATA:DATA1}",
"%{WORD:DATA2}"
]
}
break_on_match => true
}
%{DATA}에 매칭되면 DATA1 필드로 생성이 되고 매칭되지 않으면 다음패턴인 %{WORD}에 매칭되는지 확인 후 DATA2 필드로 생성이 된다.
다음처럼 match에 여러 grok패턴이 있으면 순차적으로 맞는 패턴을 확인한다.
그래서 다양한 grok패턴에 매칭이 된다면 먼저 매칭할 grok패턴을 앞쪽에 넣어줘야 원하는 필드로 생성되는걸 확인할 수 있음.
logstash를 수정해가며 확인하지 말고 Grok Debugger에서 grok패턴 확인 가능.
Custom Patterns도 넣어서 확인해볼 수 있다.
filebeat는 tomcat* 이렇게 tomcat으로 시작하는 파일은 찾을 수 있으나, tomcat_%{today} 이런식으로 오늘날짜 파일을 가져오는 패턴체크하는 방법은 없다.
- type: log
enabled: true
paths:
- /dir/tomcat*
ignore_older: 24h
fields:
log_type: "tomcat_log"
project: "my_project"
대신 ignore_older 라를 옵션을 사용하여 tomcat로 시작하고 생성된지 24시간전인 파일들만 가져오게 한다.
현재시간 : 05월09일 11시47분이라면
05월 08일 11시47분부터 쓰여진 tomcat로 시작하느 로그 파일을 가져옴.