Syslog ng 从syslog ng中的消息中删除空值

Syslog ng 从syslog ng中的消息中删除空值,syslog-ng,Syslog Ng,我需要从传入的消息中去掉NULL,这样我就可以将它转发回另一个主机。Syslog ng无法正确转发包含空值的消息。我尝试了以下方法,但无法确定如何将字符串中的NULL作为目标。在下面的代码中,我仍然可以在本地日志中看到空值,而远程系统永远看不到包含空值的消息(不是所有消息都有空值,也不是所有没有空值的消息都可以正确转发) 空值被视为字符串终止符 幸运的是,UDP源不依赖行尾(换行符或空),因此您可以在解析之前删除所有不必要的0字节,例如: source s_ise { udp(port(52

我需要从传入的消息中去掉NULL,这样我就可以将它转发回另一个主机。Syslog ng无法正确转发包含空值的消息。我尝试了以下方法,但无法确定如何将字符串中的NULL作为目标。在下面的代码中,我仍然可以在本地日志中看到空值,而远程系统永远看不到包含空值的消息(不是所有消息都有空值,也不是所有没有空值的消息都可以正确转发)


空值被视为字符串终止符

幸运的是,UDP源不依赖行尾(换行符或空),因此您可以在解析之前删除所有不必要的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);
};



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

。我在重写时一直使用双引号,因为文档中说单引号无法解析。我已经试过你说的了,现在我可以看到从本地日志中删除空值了!但是,它仍然无法转发到远程主机。。。我正在调试它。是的,当使用双引号时,\是一个转义字符,由syslog ng解释。单引号确保\用于PCRE引擎,而不是syslog ng。我终于让它工作了。您的解决方案很有帮助,但我最终还不得不将目标更改为使用TCP()而不是UDP()(因为我不需要欺骗,这很好)。我不知道为什么,这些消息的大小约为2k,我们的网络使用的是巨型帧(8192)。至少它起作用了。。。。
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);
};