サーバーからログを出荷し、各サーバーでログスタッシュを使用して出荷しています。
したがって、globからログを読み取ります"/root/Desktop/Logstash-Input/**/*_log"
。
input {
file{
path => "/root/Desktop/Logstash-Input/**/*_log"
start_position => "beginning"
}
}
このグロブから、イベントに追加するpath
からfieldsを抽出します。例:ディレクトリpath
からserver
、logtype
などを抽出します。これを行います。
filter {
grok {
match => ["path", "/root/Desktop/Logstash-Input/(?<server>[^/]+)/(?<logtype>[^/]+)/(?<logdate>[\d]+.[\d]+.[\d]+)/(?<logfilename>.*)_log"]
}
}
次に、lumberjack
出力プラグインを使用して、これらのログを中央のlogstashサーバーに出力します。
output {
lumberjack {
hosts => ["xx.xx.xx.xx"]
port => 4545
ssl_certificate => "./logstash.pub"
}
stdout { codec => rubydebug }
}
問題は、中央サーバーに送信されたログがgrok
を使用して追加されたフィールドを失うことです。たとえば、server
、logtype
などは中央サーバーに存在しません。ただし、クライアントマシンコンソールには追加されたフィールドが表示されますが、中央のlogstashサーバーにはmessage
、timestamp
、version
のみが存在します。
クライアント(ログの送信元)コンソール:
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"
}
中央サーバー(ログの送信先)コンソール:
{
"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"
}
そのため、出荷中にグロックフィールドは削除されます。なんでそうなの?
フィールドを保持するにはどうすればよいですか?
解決済み:
木こりの出力と入力にcodec => "json"
を追加することで解決しました。
出力:
output {
lumberjack {
hosts => ["xx.xx.xx.xx"]
port => 4545
ssl_certificate => "./logstash.pub"
codec => "json"
}
入力:
input {
lumberjack {
port => 4545
ssl_certificate => "/etc/ssl/logstash.pub"
ssl_key => "/etc/ssl/logstash.key"
codec => "json"
}
}