Eu configurei uma pilha ELK e estou tentando analisar as entradas de log do squid.
E estou tendo problemas ao tentar converter o seguinte horário UNIX/Epoc como
1442469455.757
para um formato legível por humanos.
Ao solucionar problemas, recebo o seguinte erro:
Recebeu um evento que possui uma codificação de caracteres diferente da configurada.
e isso vem com uma "_dateparsefailure"
tag que significa que falhou.
Eu usei o seguinte filtro logstash
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
date {
match => [ "timestamp", "UNIX" ]
}
}
}
O padrão regex definido para corresponder ao carimbo de data/hora no padrão principal "%{SQUID_LOG}"
é:(%{DATA:timestamp})
Por favor, deixe-me saber se existe uma solução permanente ou alternativa para isso.
Desde já, obrigado.
ATUALIZAR:
Isso parece ser causado pelo espaço extra após o carimbo de data/hora mencionado abaixo:
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
Existe uma maneira de se livrar deles '\\xA0\\xA0\\xA0\\xA0\\xA0'
após o carimbo de data/hora?
Configuração:
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 }
}
Dados de amostra:
1442469456.136 1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -
Responder1
Se os erros forem realmente causados pelo espaço em branco extra no time_stamp
campo, você poderá usar o mutate
filtro para strip
eliminá-los. Seu filtro ficaria assim:
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
mutate {
strip => ["time_stamp"]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
}
Atualizar
Se todas as entradas de log tiverem exatamente 6 espaços extras após o carimbo de data/hora, atualize seu padrão grok da seguinte maneira. Observe os espaços extras entre time_stamp
e 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}|-))
Se houver a possibilidade de haver mais ou menos de 6 espaços, o seguinte deve funcionar.
((%{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}|-))
Responder2
Suspeito que seja algo na análise de SQUID_LOG (como um token ausente ou extraviado).
Você poderia ver mais se colocasse seu código de filtro entre:
input {
file {
path => "/opt/logstash/squid.log"
type => "squid"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
[filter]
output {
stdout { codec => rubydebug }
}
onde /opt/logstash/squid.log são apenas algumas linhas de log problemáticas.
Com:
/opt/logstash/bin/logstash -f this_test_conf_file.conf
você verá na tela o que está acontecendo.