Syslog 支持

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

您需要将此依赖项包含到您的项目中

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-syslog</artifactId>
    <version>6.3.5</version>
</dependency>
compile "org.springframework.integration:spring-integration-syslog:6.3.5"

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

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

从 4.1.1 版本开始,框架现在支持扩展的 syslog 格式,如 RFC 5424> 中所述。此外,当使用 TCP 和 RFC5424 时,还支持 RFC 6587 中描述的 字节计数非透明帧

Syslog 入站通道适配器

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

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

从 4.1.1 版本开始,还支持 RFC 5424,方法是使用 RFC5424MessageConverter。在这种情况下,字段不会复制为标头,除非将 asMap 设置为 false,在这种情况下,原始消息是有效负载,解码后的字段是标头。

要将 RFC 5424 与 TCP 传输一起使用,您必须提供其他配置以启用 RFC 6587 中描述的不同帧技术。适配器需要一个 TCP 连接工厂,该工厂配置了 RFC6587SyslogDeserializer。默认情况下,此反序列化器通过使用换行符 (LF) 来分隔 syslog 消息,从而处理 字节计数非透明帧。当未检测到 字节计数 时,它使用 ByteArrayLfSerializer。要使用不同的 非透明 帧,您可以向其提供一些其他反序列化器。虽然反序列化器可以支持 字节计数非透明帧,但仅支持后者的其中一种形式。如果转换器上的 asMapfalse,则必须在 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 属性。此属性可以包含 udptcp。它默认为 udp

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

<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-startupphase。它引用了一个自定义的 org.springframework.integration.syslog.MessageConverter,其 ID 为 converter,以及一个 error-channel。还要注意 udp-attributes 子元素。您可以在此处设置各种 UDP 属性,如 .UDP 入站通道适配器属性 中所定义。

当您使用 udp-attributes 元素时,必须在其中提供 port 属性,而不是在 inbound-channel-adapter 元素本身中提供。

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

<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 所需)的外部定义的连接工厂的引用。