He configurado una pila ELK y estoy intentando analizar las entradas del registro de Squid.
Y tengo problemas al intentar convertir la siguiente hora UNIX/Epoc como
1442469455.757
a un formato legible por humanos.
Mientras soluciono el problema, aparece el siguiente error:
Recibí un evento que tiene una codificación de caracteres diferente a la configurada.
Y esto viene con una "_dateparsefailure"
etiqueta que significa que falló.
He utilizado el siguiente filtro logstash
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
date {
match => [ "timestamp", "UNIX" ]
}
}
}
El patrón de expresiones regulares definido para coincidir con la marca de tiempo en el patrón principal "%{SQUID_LOG}"
es:(%{DATA:timestamp})
Avíseme si existe una solución permanente o una solución alternativa para esto.
Gracias de antemano.
ACTUALIZAR:
Esto parece deberse al espacio adicional después de la marca de tiempo, como se menciona a continuación:
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
¿Hay alguna manera de deshacerse de los que están '\\xA0\\xA0\\xA0\\xA0\\xA0'
después de la marca de tiempo?
Configuración:
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 }
}
Data de muestra:
1442469456.136 1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -
Respuesta1
Si los errores realmente se deben al espacio en blanco adicional en el time_stamp
campo, puede usar el mutate
filtro para strip
solucionarlo. Su filtro entonces se vería así:
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
mutate {
strip => ["time_stamp"]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
}
Actualizar
Si todas las entradas del registro tienen exactamente 6 espacios adicionales después de la marca de tiempo, actualice su patrón grok de la siguiente manera. Tenga en cuenta los espacios adicionales entre time_stamp
y 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}|-))
Si existe la posibilidad de que sean más o menos de 6 espacios, lo siguiente debería 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}|-))
Respuesta2
Sospecho que es algo en el análisis de SQUID_LOG (como un token faltante o fuera de lugar).
Podrías ver más si colocas tu 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 }
}
donde /opt/logstash/squid.log son solo algunas líneas de registro problemáticas.
Con:
/opt/logstash/bin/logstash -f this_test_conf_file.conf
Vas a ver en pantalla lo que está pasando.