Syslog 支持
Spring Integration 2.2 引入了 syslog 转换器:SyslogToMapTransformer。
此依赖项为项目所需:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-syslog</artifactId>
<version>7.0.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-syslog:7.0.2"
该转换器与 UDP 或 TCP 入站适配器配合使用,可用于接收和分析来自其他主机的系统日志记录。转换器会创建一个消息负载,其中包含系统日志消息中各元素的映射。
Spring Integration 3.0 引入了便捷的命名空间支持,可通过单一元素配置 syslog 入站适配器。
Syslog 入站通道适配器
该元素包含一个 UDP 或 TCP 入站通道适配器以及一个 MessageConverter,用于将 syslog 消息转换为 Spring Integration 消息。DefaultMessageConverter 会委托 SyslogToMapTransformer 进行处理,创建一个消息,其有效载荷为 syslog 字段的 Map。此外,除消息外的所有字段也会作为消息头提供,并以 syslog_ 作为前缀。在此模式下,仅支持 RFC 3164(BSD)格式的 syslog。
自 4.1 版本起,DefaultMessageConverter 新增了一个名为 asMap 的属性(默认值为 true)。当该属性设置为 false 时,转换器会将消息负载保留为原始的完整 syslog 消息(以 byte[] 形式),同时仍会设置消息头。
自 4.1.1 版本起,通过使用 RFC5424MessageConverter 也支持了 RFC 5424。在这种情况下,字段不会被复制为头部,除非将 asMap 设置为 false,此时原始消息作为有效载荷,解码后的字段则作为头部。
要通过 TCP 传输使用 RFC 5424,您必须提供额外的配置以启用 RFC 6587 中描述的不同帧技术。适配器需要一个配置了 RFC6587SyslogDeserializer 的 TCP 连接工厂。默认情况下,该反序列化器通过使用换行符 (LF) 来分隔 syslog 消息,从而处理 octet counting 和 non-transparent framing。当未检测到 octet counting 时,它使用 ByteArrayLfSerializer。要使用不同的 non-transparent 帧技术,您可以为其提供其他反序列化器。虽然反序列化器可以同时支持 octet counting 和 non-transparent framing,但后者仅支持一种形式。如果转换器上的 asMap 为 false,则必须在 RFC6587SyslogDeserializer 中设置 retainOriginal 构造函数参数。
示例配置
以下示例定义了一个 UDP 适配器,用于将消息发送到 syslogIn 通道(适配器 Bean 的名称为 syslogIn.adapter):
<int-syslog:inbound-channel-adapter id="syslogIn" port="1514" />
适配器监听端口 1514。
以下示例定义了一个 UDP 适配器,用于将消息发送到 fromSyslog 通道(适配器 Bean 的名称为 syslogIn):
<int-syslog:inbound-channel-adapter id="syslogIn"
channel="fromSyslog" port="1514" />
适配器监听端口 1514。
以下示例定义了一个 TCP 适配器,用于向通道 syslogIn 发送消息(适配器 Bean 的名称为 syslogIn.adapter):
<int-syslog:inbound-channel-adapter id="bar" protocol="tcp" port="1514" />
适配器监听端口 1514。
请注意新增的 protocol 属性。该属性可设置为 udp 或 tcp,默认值为 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>
前面的示例还展示了两个 SmartLifecycle 属性:auto-startup 和 phase。它引用了一个自定义的 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" />
它还展示了如何引用外部定义的连接工厂,该工厂可用于高级配置(套接字保持连接和其他用途)。有关更多信息,请参阅 TCP 连接工厂。
外部配置的 connection-factory 必须为 server 类型,且端口应在该配置中定义,而非在 inbound-channel-adapter 元素本身定义。
以下示例展示了一个 TCP 适配器,它将消息发送到通道 fromSyslog:
<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" />
前面的示例配置为使用 RFC 5424 转换器,并通过引用外部定义的连接工厂来配置 RFC 6587 反序列化器(RFC 5424 所必需)。