我使用logstash作为syslog中继,它将数据转发到graylog并将数据写入文件。
我使用dns过滤器模块将IP替换为FQDN,之后我无法将原始内容写入文件,IP为"json-ed"。
结果:
2022-05-17T15:17:01.580175Z {ip=vm2345.lab.com} <86>1 2022-05-17T17:17:01.579496+02:00 vm2345 CRON 2057538 - - pam_unix(cron:session): session closed for user root
我想要得到的:
2022-05-17T15:17:01.580175Z vm2345.lab.com <86>1 2022-05-17T17:17:01.579496+02:00 vm2345 CRON 2057538 - - pam_unix(cron:session): session closed for user root
我的配置:
input {
syslog {
port => 514
type => "rsyslog"
}
}
filter {
if [type] == "rsyslog" {
dns {
reverse => [ "[host][ip]" ]
action => "replace"
}
}
}
output {
if [type] == "rsyslog" {
gelf {
host => "graylog.lab.com"
port => 5516
}
file {
path => "/data/%{+YYYY}/%{+MM}/%{+dd}/%{[host][ip]}/%{[host][ip]}_%{{yyyy_MM_dd}}.log"
codec => "line"
}
stdout { }
}
}
处理这个问题最好的方法是什么?
使用编解码器时=>第一行,@format选项没有默认设置,因此编解码器在事件上调用.to_s。事件的toString方法将@timestamp、[host]字段和[message]字段连接起来。您需要[host][ip]字段,而不是[host]字段(它是一个对象),因此告诉编解码器
codec => line { format => "%{@timestamp} %{[host][ip]} %{message}" }