rsyslog没有在JSON中转义反斜杠

时间:2019-01-28 10:15:01

标签: rsyslog

我正在运行一个rsyslogd实例,它从syslog中生成以下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符号的十六进制表示。应该以{{1​​}}的形式转义。

我在GitHub上注意到有一个未解决的问题(https://github.com/rsyslog/rsyslog/issues/1235),尽管它提到了另一个导致合并修复的问题。

以下是一些系统信息:

\\ususe

用于创建JSON文档的模板为:

:~# 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

rsyslog中是否有任何功能可以解决此问题,或者它看起来像是上游错误?

1 个答案:

答案 0 :(得分:1)

我注意到您在消息模板中使用globals.js。如果使用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" 

,其中"json":"LOCAL\\ususer \"abc\", "jsonr":"LOCAL\ususer \"abc\", 格式已将json转义为\u(已通过rsyslog-8.27.0测试)。 如果这不适合您,您可以随时在操作之前添加消息,例如如下所示:

\\u

并在您的模板中使用

set $.msg2 = replace($rawmsg, "\\u", "\\\\u");

replace函数执行全局替换,因此您可能想限制它,例如使用

constant(value="\",\"message\":\"") property(name="$.msg2" format="jsonr")