Syslog 支持
Spring Integration 2.2 引入了 syslog 转换器:SyslogToMapTransformer。
你需要将这个依赖添加到你的项目中:
- Maven
- Gradle
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-syslog</artifactId>
    <version>6.4.2</version>
</dependency>
compile "org.springframework.integration:spring-integration-syslog:6.4.2"
此转换器与 UDP 或 TCP 入站适配器一起使用,可用于接收和分析来自其他主机的 syslog 记录。转换器创建一个消息有效负载,其中包含来自 syslog 消息的元素映射。
Spring Integration 3.0 引入了方便的命名空间支持,可以在单个元素中配置一个 syslog 入站适配器。
Syslog 入站通道适配器
此元素包含一个 UDP 或 TCP 入站通道适配器和一个 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,否则字段不会被复制为标题。在这种情况下,原始消息是有效载荷,解码后的字段是标题。
要使用带有 TCP 传输的 RFC 5424,您必须提供额外的配置以启用 RFC 6587 中描述的不同分帧技术。适配器需要一个使用 RFC6587SyslogDeserializer 配置的 TCP 连接工厂。默认情况下,此反序列化器通过使用换行符 (LF) 来分隔 syslog 消息来处理 八位字节计数 和 非透明分帧。当未检测到 八位字节计数 时,它使用 ByteArrayLfSerializer。要使用不同的 非透明 分帧,可以为其提供其他反序列化器。虽然反序列化器可以支持 八位字节计数 和 非透明分帧,但仅支持后者的其中一种形式。如果转换器上的 asMap 为 false,则必须在 RFC6587SyslogDeserializer 中设置 retainOriginal 构造函数参数。
示例配置
以下示例定义了一个向 syslogIn 频道发送消息的 UDP 适配器(适配器 bean 名称为 syslogIn.adapter):
<int-syslog:inbound-channel-adapter id="syslogIn" port="1514" />
适配器监听端口 1514。
以下示例定义了一个向 fromSyslog 通道发送消息的 UDP 适配器(适配器 bean 名称为 syslogIn):
<int-syslog:inbound-channel-adapter id="syslogIn"
	channel="fromSyslog" port="1514" />
适配器监听端口 1514。
以下示例定义了一个将消息发送到 syslogIn 通道的 TCP 适配器(适配器 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 元素本身上定义。
以下示例显示了一个将消息发送到 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" />
前面的例子配置为使用 RFC 5424 转换器,并配置了一个引用外部定义的连接工厂,该工厂使用 RFC 6587 反序列化器(这是 RFC 5424 所必需的)。