我已经设置了 ELK 堆栈,并正在尝试解析 squid 日志条目。
我在尝试将以下 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
您将在屏幕上看到正在发生的事情。