rsyslog 没有在 JSON 中转义反斜杠
rsyslog not escaping backslash in JSON
我有一个 rsyslogd 实例 运行,从系统日志中生成以下 JSON:
{"timegenerated":"2019-01-28T09:24:37.033990+00:00","type":"syslog","host":"REDACTED_HOSTNAME","host-ip":"REDACTED_IP","message":"<190>Jan 28 2019 10:24:35: %ASA-X-XXXXXX: Teardown TCP connection 82257709 for outside:REDACTED_IP\/REDACTED_PORT(LOCAL\ususername) to inside:REDACTED_IP\/REDACTED_PORT duration 0:01:52 bytes XXXX TCP FINs from outside (ususername)"}
这是无效的 JSON,因为 \ususe
被解释为 unicode 符号的十六进制表示。它应该被转义为 \ususe
.
我在 GitHub 上注意到有一个未解决的问题 (https://github.com/rsyslog/rsyslog/issues/1235),尽管它提到了另一个导致合并修复的问题。
这是一些系统信息:
:~# rsyslogd -version
rsyslogd 8.24.0, compiled with:
PLATFORM: x86_64-pc-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
memory allocator: system default
Runtime Instrumentation (slow code): No
uuid support: Yes
Number of Bits in RainerScript integers: 64
:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
用于创建 JSON 文档的模板是:
template(name="json_syslog"
type="list") {
constant(value="{")
constant(value="\"timegenerated\":\"") property(name="timegenerated" dateFormat="rfc3339")
constant(value="\",\"type\":\"syslograw")
constant(value="\",\"host\":\"") property(name="fromhost")
constant(value="\",\"host-ip\":\"") property(name="fromhost-ip")
constant(value="\",\"message\":\"") property(name="rawmsg" format="jsonr")
constant(value="\"}\n")
rsyslog 中是否有任何功能可以让我修复这个问题,或者它看起来像是一个上游错误?
我注意到您在邮件模板中使用了 format="jsonr"
。如果您使用 json
而不是 jsonr
,则会有所不同,文档将其描述为 避免双重转义值 。使用带有
的模板
constant(value="\",\n\"json\":\"") property(name="rawmsg" format="json")
constant(value="\",\n\"jsonr\":\"") property(name="rawmsg" format="jsonr")
并提供包含
的输入
LOCAL\ususer "abc"
产生 2 行
"json":"LOCAL\ususer \"abc\",
"jsonr":"LOCAL\ususer \"abc\",
其中 json
格式已将 \u
转义为 \u
(使用 rsyslog-8.27.0 测试)。
如果这不适合您,您可以随时操作消息,例如如下所示,在您的操作之前添加:
set $.msg2 = replace($rawmsg, "\u", "\\u");
并在您的模板中使用
constant(value="\",\"message\":\"") property(name="$.msg2" format="jsonr")
replace 函数进行全局替换,因此您可能希望限制它,例如
set $.msg2 = replace($rawmsg, "LOCAL\u", "LOCAL\\u");
我有一个 rsyslogd 实例 运行,从系统日志中生成以下 JSON:
{"timegenerated":"2019-01-28T09:24:37.033990+00:00","type":"syslog","host":"REDACTED_HOSTNAME","host-ip":"REDACTED_IP","message":"<190>Jan 28 2019 10:24:35: %ASA-X-XXXXXX: Teardown TCP connection 82257709 for outside:REDACTED_IP\/REDACTED_PORT(LOCAL\ususername) to inside:REDACTED_IP\/REDACTED_PORT duration 0:01:52 bytes XXXX TCP FINs from outside (ususername)"}
这是无效的 JSON,因为 \ususe
被解释为 unicode 符号的十六进制表示。它应该被转义为 \ususe
.
我在 GitHub 上注意到有一个未解决的问题 (https://github.com/rsyslog/rsyslog/issues/1235),尽管它提到了另一个导致合并修复的问题。
这是一些系统信息:
:~# rsyslogd -version
rsyslogd 8.24.0, compiled with:
PLATFORM: x86_64-pc-linux-gnu
PLATFORM (lsb_release -d):
FEATURE_REGEXP: Yes
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
memory allocator: system default
Runtime Instrumentation (slow code): No
uuid support: Yes
Number of Bits in RainerScript integers: 64
:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
用于创建 JSON 文档的模板是:
template(name="json_syslog"
type="list") {
constant(value="{")
constant(value="\"timegenerated\":\"") property(name="timegenerated" dateFormat="rfc3339")
constant(value="\",\"type\":\"syslograw")
constant(value="\",\"host\":\"") property(name="fromhost")
constant(value="\",\"host-ip\":\"") property(name="fromhost-ip")
constant(value="\",\"message\":\"") property(name="rawmsg" format="jsonr")
constant(value="\"}\n")
rsyslog 中是否有任何功能可以让我修复这个问题,或者它看起来像是一个上游错误?
我注意到您在邮件模板中使用了 format="jsonr"
。如果您使用 json
而不是 jsonr
,则会有所不同,文档将其描述为 避免双重转义值 。使用带有
constant(value="\",\n\"json\":\"") property(name="rawmsg" format="json")
constant(value="\",\n\"jsonr\":\"") property(name="rawmsg" format="jsonr")
并提供包含
的输入LOCAL\ususer "abc"
产生 2 行
"json":"LOCAL\ususer \"abc\",
"jsonr":"LOCAL\ususer \"abc\",
其中 json
格式已将 \u
转义为 \u
(使用 rsyslog-8.27.0 测试)。
如果这不适合您,您可以随时操作消息,例如如下所示,在您的操作之前添加:
set $.msg2 = replace($rawmsg, "\u", "\\u");
并在您的模板中使用
constant(value="\",\"message\":\"") property(name="$.msg2" format="jsonr")
replace 函数进行全局替换,因此您可能希望限制它,例如
set $.msg2 = replace($rawmsg, "LOCAL\u", "LOCAL\\u");