从 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 配置对象(例如,解析器、基于字符串的重写规则、字符串过滤器等) .
我需要从传入消息中去除 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 配置对象(例如,解析器、基于字符串的重写规则、字符串过滤器等) .