从 syslog-ng 中的消息中去除空值

Strip nulls from message in syslog-ng

我需要从传入消息中去除 NULL,以便将其转发回另一台主机。 Syslog-ng 不会正确转发其中包含任何空值的消息。我尝试了以下但无法弄清楚如何定位字符串中的 NULL。在下面,我仍然在本地日志中看到空值,而远程系统永远看不到其中包含空值的消息 (并非所有消息都有空值,没有空值的消息会正确转发)。

source s_ise {
  udp(port(522));
};

destination d_ise {
  file("/var/log/ise.log");
  udp("myhost.example" port(516) spoof_source(no));
};

rewrite r_ise {
  # remove nulls, or it won't forward properly
  subst("\x00", "", type("string"), value("MESSAGE"), flags(substring, global));
};

log {
  source(s_ise);
  filter(f_ise_aaa);
  rewrite(r_ise);
  destination(d_ise);
};

NULL 被视为字符串终止符。

好在UDP源码不依赖行尾(换行符或NULL),所以解析前可以去掉所有不需要的0字节,例如:

source s_ise {
  udp(port(522) flags(no-parse));
};

rewrite r_remove_nulls {
  subst('\x00', '', value("MESSAGE"), type(pcre), flags(global)); # single quotes!
};

parser p_syslog {
  syslog-parser();
};

destination d_ise {
  file("/var/log/ise.log");
  udp("myhost.example" port(516) spoof_source(no));
};

log {
  source(s_ise);
  rewrite(r_remove_nulls);
  parser(p_syslog);

  filter(f_ise_aaa);
  destination(d_ise);
};


或者,您可以保留 NULL 字节,但在这种情况下,您不应使用将消息视为字符串的 syslog-ng 配置对象(例如,解析器、基于字符串的重写规则、字符串过滤器等) .