Syslog 支持
Spring Integration 2.2 引入了 syslog 转换器:SyslogToMapTransformer
。
您需要在项目中包含此依赖项
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-syslog</artifactId>
<version>6.4.4</version>
</dependency>
compile "org.springframework.integration:spring-integration-syslog:6.4.4"
此转换器与 UDP
或 TCP
入站适配器结合使用,可用于接收和分析来自其他主机的 syslog 记录。转换器创建的消息 payload 包含 syslog 消息元素的 map。
Spring Integration 3.0 引入了方便的命名空间支持,用于在单个元素中配置 syslog 入站适配器。
Syslog 入站通道适配器
此元素包含 UDP
或 TCP
入站通道适配器以及一个 MessageConverter
,用于将 syslog 消息转换为 Spring Integration 消息。DefaultMessageConverter
委托给 SyslogToMapTransformer
,创建一个消息,其 payload 是 syslog 字段的 Map
。此外,除了消息本身之外的所有字段也作为消息头提供,并以 syslog_
为前缀。在此模式下,仅支持 RFC 3164 (BSD) syslog。
从 4.1 版本开始,DefaultMessageConverter
有一个名为 asMap
的属性(默认值为 true
)。当其值为 false
时,转换器会将消息 payload 保留为原始的完整 syslog 消息(以 byte[]
形式),同时仍设置消息头。
从 4.1.1 版本开始,还通过使用 RFC5424MessageConverter
支持 RFC 5424。在此情况下,字段不会被复制为消息头,除非 asMap
设置为 false
,此时原始消息是 payload,而解码后的字段是消息头。
要将 RFC 5424 与 TCP 传输一起使用,您必须提供额外配置来启用 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
。
以下示例展示了一个 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-startup
和 phase
。它引用了一个自定义的 org.springframework.integration.syslog.MessageConverter
,其 ID 为 converter
,并且指定了 error-channel
。另请注意 udp-attributes
子元素。您可以在此处设置各种 UDP 属性,如 .UDP 入站通道适配器属性 中定义。
当您使用 udp-attributes 元素时,必须在此处而不是在 inbound-channel-adapter 元素本身上提供 port 属性。 |
以下示例展示了一个 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" />
它还展示了如何引用外部定义的连接工厂,该工厂可用于高级配置(socket keep-alive 和其他用途)。更多信息请参阅 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 所必需)的外部定义连接工厂的引用。