Ich habe einen ELK-Stapel eingerichtet und versuche, Squid-Protokolleinträge zu analysieren.
Und ich habe ein Problem beim Versuch, die folgende UNIX/Epoc-Zeit umzuwandeln als
1442469455.757
in ein für Menschen lesbares Format.
Während der Fehlerbehebung erhalte ich die folgende Fehlermeldung:
Es wurde ein Ereignis empfangen, das eine andere Zeichenkodierung aufweist als die von Ihnen konfigurierte.
und es ist mit einem "_dateparsefailure"
Etikett versehen, das bedeutet, dass es fehlgeschlagen ist.
Ich habe den folgenden Logstash-Filter verwendet
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
date {
match => [ "timestamp", "UNIX" ]
}
}
}
Das zum Abgleichen mit dem Zeitstempel im Hauptmuster definierte Regex-Muster "%{SQUID_LOG}"
lautet:(%{DATA:timestamp})
Bitte lassen Sie mich wissen, ob es dafür eine dauerhafte Lösung oder einen Workaround gibt.
Dank im Voraus.
AKTUALISIEREN:
Die Ursache hierfür scheint das zusätzliche Leerzeichen nach dem Zeitstempel zu sein, wie unten erwähnt:
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'
Gibt es eine Möglichkeit, diese nach dem Zeitstempel loszuwerden ?
Konfiguration:
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 }
}
Beispieldaten:
1442469456.136 1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -
Antwort1
Wenn die Fehler tatsächlich durch die zusätzlichen Leerzeichen im Feld verursacht werden time_stamp
, können Sie den mutate
Filter verwenden, um strip
sie zu beseitigen. Ihr Filter würde dann folgendermaßen aussehen:
filter {
if [type] == "squid" {
grok {
patterns_dir => [ "/etc/logstash/patterns" ]
match => { message => "%{SQUID_LOG}" }
}
mutate {
strip => ["time_stamp"]
}
date {
match => [ "time_stamp", "UNIX" ]
}
}
}
Aktualisieren
Wenn alle Protokolleinträge genau 6 zusätzliche Leerzeichen nach dem Zeitstempel haben, aktualisieren Sie Ihr Grok-Muster wie folgt. Beachten Sie die zusätzlichen Leerzeichen zwischen time_stamp
und 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}|-))
Wenn die Möglichkeit besteht, dass es mehr oder weniger als 6 Leerzeichen sind, sollte Folgendes funktionieren.
((%{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}|-))
Antwort2
Ich vermute, dass es an der Analyse von SQUID_LOG liegt (z. B. ein fehlendes oder falsch platziertes Token).
Sie können mehr sehen, wenn Sie Ihren Filtercode dazwischen setzen:
input {
file {
path => "/opt/logstash/squid.log"
type => "squid"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
[filter]
output {
stdout { codec => rubydebug }
}
wobei /opt/logstash/squid.log nur aus einigen problematischen Protokollzeilen besteht.
Mit:
/opt/logstash/bin/logstash -f this_test_conf_file.conf
Sie werden auf dem Bildschirm sehen, was passiert.