logstash mix json 和普通内容

logstash mix json and plain content

我使用 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 选项没有默认设置,因此事件的 codec calls, .to_s on the event. The toString method 连接了 @timestamp、[host] 字段和 [message] 字段.你想要 [host][ip] 字段,而不是 [host] 字段(它是一个对象)所以告诉编解码器

codec => line { format => "%{@timestamp} %{[host][ip]} %{message}" }