跳到主要内容

Syslog 支持

QWen Plus 中英对照 Syslog Support

Spring Integration 2.2 引入了 syslog 转换器:SyslogToMapTransformer

你需要将这个依赖添加到你的项目中:

<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-syslog</artifactId>
<version>6.4.2</version>
</dependency>
xml

此转换器与 UDPTCP 入站适配器一起使用,可用于接收和分析来自其他主机的 syslog 记录。转换器创建一个消息有效负载,其中包含来自 syslog 消息的元素映射。

Spring Integration 3.0 引入了方便的命名空间支持,可以在单个元素中配置一个 syslog 入站适配器。

从 4.1.1 版本开始,框架现在支持扩展的 syslog 格式,如 RFC 5424> 中所指定的。此外,在使用 TCP 和 RFC5424 时,支持 RFC 6587 中描述的 octet countingnon-transparent framing

Syslog 入站通道适配器

此元素包含一个 UDPTCP 入站通道适配器和一个 MessageConverter,用于将 syslog 消息转换为 Spring Integration 消息。DefaultMessageConverter 委托给 SyslogToMapTransformer,创建一个其有效负载为 syslog 字段 Map 的消息。此外,除了消息本身之外的所有字段也都作为带有 syslog_ 前缀的消息头提供。在这种模式下,仅支持 RFC 3164 (BSD) 格式的 syslogs。

自从 4.1 版本以来,DefaultMessageConverter 有一个名为 asMap 的属性(默认值为 true)。当它设置为 false 时,转换器会将消息有效负载保留为原始完整的 syslog 消息(以 byte[] 形式),同时仍然设置标题。

自 4.1.1 版本起,也支持 RFC 5424,通过使用 RFC5424MessageConverter。在这种情况下,除非将 asMap 设置为 false,否则字段不会被复制为标题。在这种情况下,原始消息是有效载荷,解码后的字段是标题。

important

要使用带有 TCP 传输的 RFC 5424,您必须提供额外的配置以启用 RFC 6587 中描述的不同分帧技术。适配器需要一个使用 RFC6587SyslogDeserializer 配置的 TCP 连接工厂。默认情况下,此反序列化器通过使用换行符 (LF) 来分隔 syslog 消息来处理 八位字节计数非透明分帧。当未检测到 八位字节计数 时,它使用 ByteArrayLfSerializer。要使用不同的 非透明 分帧,可以为其提供其他反序列化器。虽然反序列化器可以支持 八位字节计数非透明分帧,但仅支持后者的其中一种形式。如果转换器上的 asMapfalse,则必须在 RFC6587SyslogDeserializer 中设置 retainOriginal 构造函数参数。

示例配置

以下示例定义了一个向 syslogIn 频道发送消息的 UDP 适配器(适配器 bean 名称为 syslogIn.adapter):

<int-syslog:inbound-channel-adapter id="syslogIn" port="1514" />
xml

适配器监听端口 1514

以下示例定义了一个向 fromSyslog 通道发送消息的 UDP 适配器(适配器 bean 名称为 syslogIn):

<int-syslog:inbound-channel-adapter id="syslogIn"
channel="fromSyslog" port="1514" />
xml

适配器监听端口 1514

以下示例定义了一个将消息发送到 syslogIn 通道的 TCP 适配器(适配器 bean 名称为 syslogIn.adapter):

<int-syslog:inbound-channel-adapter id="bar" protocol="tcp" port="1514" />
xml

适配器监听端口 1514

注意 protocol 属性的添加。此属性可以包含 udptcp。默认值为 udp

以下示例显示了一个将消息发送到 fromSyslog 通道的 UDP 适配器:

<int-syslog:inbound-channel-adapter id="udpSyslog"
channel="fromSyslog"
auto-startup="false"
phase="10000"
converter="converter"
send-timeout="1000"
error-channel="errors">
<int-syslog:udp-attributes port="1514" lookup-host="false" />
</int-syslog:inbound-channel-adapter>
xml

前面的例子还展示了两个 SmartLifecycle 属性:auto-startupphase。它引用了一个自定义的 org.springframework.integration.syslog.MessageConverter,其 ID 为 converter,并有一个 error-channel。还要注意 udp-attributes 子元素。你可以在这里设置各种 UDP 属性,如 。UDP 入站通道适配器属性 中所定义的。

备注

当你使用 udp-attributes 元素时,你必须在那里提供 port 属性,而不是在 inbound-channel-adapter 元素本身上。

以下示例显示了一个将消息发送到 fromSyslog 通道的 TCP 适配器:

<int-syslog:inbound-channel-adapter id="TcpSyslog"
protocol="tcp"
channel="fromSyslog"
connection-factory="cf" />

<int-ip:tcp-connection-factory id="cf" type="server" port="1514" />
xml

它还展示了如何引用外部定义的连接工厂,这可以用于高级配置(如套接字保持活动和其他用途)。有关更多信息,请参阅 TCP 连接工厂

备注

外部配置的 connection-factory 必须是 server 类型,端口在那里定义,而不是在 inbound-channel-adapter 元素本身上定义。

以下示例显示了一个将消息发送到 fromSyslog 通道的 TCP 适配器:

<int-syslog:inbound-channel-adapter id="rfc5424Tcp"
protocol="tcp"
channel="fromSyslog"
connection-factory="cf"
converter="rfc5424" />

<int-ip:tcp-connection-factory id="cf"
using-nio="true"
type="server"
port="1514"
deserializer="rfc6587" />

<bean id="rfc5424" class="org.springframework.integration.syslog.RFC5424MessageConverter" />

<bean id="rfc6587" class="org.springframework.integration.syslog.inbound.RFC6587SyslogDeserializer" />
xml

前面的例子配置为使用 RFC 5424 转换器,并配置了一个引用外部定义的连接工厂,该工厂使用 RFC 6587 反序列化器(这是 RFC 5424 所必需的)。