Estamos enviando logs de servidores e usando o logstash em cada servidor para envio.
Então, lemos os logs do glob "/root/Desktop/Logstash-Input/**/*_log"
.
input {
file{
path => "/root/Desktop/Logstash-Input/**/*_log"
start_position => "beginning"
}
}
Desta glob nós extraímos campos do path
que queremos adicionar ao evento. Ex .: no diretório path
extraia o server
, logtype
, etc. Fazemos isso:
filter {
grok {
match => ["path", "/root/Desktop/Logstash-Input/(?<server>[^/]+)/(?<logtype>[^/]+)/(?<logdate>[\d]+.[\d]+.[\d]+)/(?<logfilename>.*)_log"]
}
}
Em seguida, enviamos esses logs para o servidor logstash central usando o plug-in lumberjack
output.
output {
lumberjack {
hosts => ["xx.xx.xx.xx"]
port => 4545
ssl_certificate => "./logstash.pub"
}
stdout { codec => rubydebug }
}
O problema é que os logs enviados para o servidor central perdem os campos adicionados usando grok
. Por exemplo, server
, logtype
, etc não estão presentes no servidor central. No entanto, o console da máquina cliente mostra os campos adicionados, mas no servidor logstash central somente message
, timestamp
, version
está presente.
Console do cliente (de onde os logs são enviados):
output received {:event=>{"message"=>"2014-05-26T00:00:01+05:30 host crond[268]: (root) CMD (2014/05/31/server2/cron/log)", "@version"=>"1", "@timestamp"=>"2014-07-16T06:07:21.927Z", "host"=>"host", "path"=>"/root/Desktop/Logstash-Input/Server2/CronLog/2014.05.31/cron_log", "server"=>"Server2", "logtype"=>"CronLog", "logdate"=>"2014.05.31", "logfilename"=>"cron"}, :level=>:debug, :file=>"(eval)", :line=>"37"}
{
"message" => "2014-05-26T00:00:01+05:30 bx920as1 crond[268]: (root) CMD (2014/05/31/server2/cron/log)",
"@version" => "1",
"@timestamp" => "2014-07-16T06:07:21.927Z",
"host" => "host",
"path" => "/root/Desktop/Logstash-Input/Server2/CronLog/2014.05.31/cron_log",
"server" => "Server2",
"logtype" => "CronLog",
"logdate" => "2014.05.31",
"logfilename" => "cron"
}
console central (para onde os logs são enviados) console :
{
"message" => "2014-07-16T05:33:17.073+0000 host 2014-05-26T00:00:01+05:30 bx920as1 crond[288]: (root) CMD (2014/05/31/server2/cron/log)",
"@version" => "1",
"@timestamp" => "2014-07-16T05:34:02.370Z"
}
Assim, os campos com grok são descartados durante o envio. Por que isso acontece?
Como posso manter os campos ??