ELK 스택을 설정했고 오징어 로그 항목을 구문 분석하려고 합니다.
그리고 다음 UNIX/Epoc 시간을 다음과 같이 변환하는 데 문제가 있습니다.
1442469455.757
사람이 읽을 수 있는 형식으로 변환합니다.
문제를 해결하는 동안 다음 오류가 발생합니다.
구성한 것과 다른 문자 인코딩이 포함된 이벤트를 받았습니다.
이는 "_dateparsefailure"
실패했음을 의미하는 태그와 함께 제공됩니다.
다음 Logstash 필터를 사용했습니다.
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
date {
match => [ "timestamp", "UNIX" ]
}
}
}
기본 패턴의 타임스탬프와 일치하도록 정의된 정규식 패턴은 "%{SQUID_LOG}"
다음과 같습니다.(%{DATA:timestamp})
이에 대한 영구적인 해결 방법이나 해결 방법이 있으면 알려 주시기 바랍니다.
미리 감사드립니다.
업데이트:
이는 아래에 언급된 것처럼 타임스탬프 뒤에 추가 공간이 있기 때문에 발생하는 것 같습니다.
value=>"1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0", :exception=>"Invalid UNIX epoch value '1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0'", :config_parsers=>"UNIX", :config_locale=>"default=en_GB", :level=>:warn
'\\xA0\\xA0\\xA0\\xA0\\xA0'
타임스탬프 이후의 항목을 제거할 수 있는 방법이 있습니까 ?
구성:
input { stdin { } }
filter {
grok {
match => { message => "((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))" }
add_tag => "NONU"
}
mutate {
strip => [ "time_stamp" ]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
output {
stdout { codec => rubydebug }
}
샘플 데이터:
1442469456.136 1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -
답변1
필드의 추가 공백으로 인해 오류가 실제로 발생하는 경우 필터를 사용하여 오류를 제거 time_stamp
할 수 있습니다 . 그러면 필터는 다음과 같습니다.mutate
strip
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
mutate {
strip => ["time_stamp"]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
}
업데이트
모든 로그 항목의 타임스탬프 뒤에 정확히 6개의 추가 공백이 있는 경우 다음과 같이 grok 패턴을 업데이트하세요. time_stamp
와 사이에 추가 공백이 있는지 확인하십시오 time_epapsed_ms
.
((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))
공백이 6개보다 많거나 적을 가능성이 있는 경우 다음이 작동합니다.
((%{DATA:time_stamp})%{SPACE}(%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))
답변2
SQUID_LOG 구문 분석에 문제가 있는 것 같습니다(토큰이 누락되거나 잘못 배치된 경우 등).
필터 코드를 다음 사이에 넣으면 더 많은 것을 볼 수 있습니다.
input {
file {
path => "/opt/logstash/squid.log"
type => "squid"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
[filter]
output {
stdout { codec => rubydebug }
}
여기서 /opt/logstash/squid.log는 문제가 있는 몇 가지 로그 줄입니다.
와 함께:
/opt/logstash/bin/logstash -f this_test_conf_file.conf
당신은 무슨 일이 일어나고 있는지 화면에서 보게 될 것입니다.