# syslog 支持 ## syslog 支持 Spring Integration2.2 引入了 syslog 转换器:`SyslogToMapTransformer`。 你需要在项目中包含此依赖项: Maven ``` org.springframework.integration spring-integration-syslog 5.5.9 ``` Gradle ``` compile "org.springframework.integration:spring-integration-syslog:5.5.9" ``` 此转换器与`UDP`或`TCP`入站适配器一起,可用于接收和分析来自其他主机的 syslog 记录。Transformer 创建一个消息有效负载,其中包含来自 syslog 消息的元素的映射。 Spring Integration3.0 引入了方便的名称空间支持,用于在单个元素中配置 SYSLOG 入站适配器。 从版本 4.1.1 开始,该框架现在支持扩展的 SYSLOG 格式,如[RFC 5424\>](https://tools.ietf.org/html/rfc5424)中所指定的。此外,当使用 TCP 和 RFC5424 时,`octet counting`和`non-transparent framing`中描述的[RFC 6587](https://tools.ietf.org/html/rfc6587)都是支持的。 ### syslog 入站通道适配器 这个元素包含`UDP`或`TCP`入站通道适配器和`MessageConverter`以将 SYSLOG 消息转换为 Spring 集成消息。将`DefaultMessageConverter`委托给`SyslogToMapTransformer`,创建一条消息,其有效负载为 syslog 字段的`Map`。此外,除消息之外的所有字段也可以作为消息中的标题使用,并以`syslog_`作为前缀。在此模式下,只支持[RFC 3164](https://tools.ietf.org/html/rfc3164)syslogs。 从版本 4.1 开始,`DefaultMessageConverter`有一个名为`asMap`的属性(缺省值是`true`)。当它是`false`时,转换器将消息有效负载作为原始完整的 SYSLOG 消息(在`byte[]`中),同时仍然设置头。 从版本 4.1.1 开始,通过使用`RFC5424MessageConverter`也支持 RFC5424。在这种情况下,字段不会被复制为标题,除非`asMap`被设置为`false`,在这种情况下,原始消息是有效载荷,而解码的字段是标题。 | |要在 TCP 传输中使用 RFC5424,你必须提供额外的配置,以启用 RFC6587 中描述的不同帧技术,
适配器需要一个配置有`RFC6587SyslogDeserializer`的 TCP 连接工厂,
默认情况下,这个反序列化器通过使用 LineFeed 来分隔 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`): ``` ``` 适配器侦听端口`1514`。 下面的示例定义了一个`UDP`适配器,该适配器将消息发送到`fromSyslog`通道(适配器 Bean 名称为`syslogIn`): ``` ``` 适配器侦听端口`1514`。 下面的示例定义了一个`TCP`适配器,该适配器将消息发送到通道`syslogIn`(适配器 Bean 名称为`syslogIn.adapter`): ``` ``` 适配器侦听端口`1514`。 注意添加了`protocol`属性。此属性可以包含`udp`或`tcp`。它默认为`udp`。 下面的示例显示了一个`UDP`适配器,该适配器将消息发送到通道`fromSyslog`: ``` ``` 前面的示例还显示了两个`SmartLifecycle`属性:`auto-startup`和`phase`。它引用了一个自定义的`org.springframework.integration.syslog.MessageConverter`,其 ID 为`converter`,而`error-channel`。还要注意`udp-attributes`子元素。你可以在这里设置各种 UDP 属性,如[.UDP 入站通道适配器属性](./ip.html#ip-udp-ib-atts)中所定义的。 | |当使用`udp-attributes`元素时,必须在那里提供`port`属性,而不是在`inbound-channel-adapter`元素本身上。| |---|---------------------------------------------------------------------------------------------------------------------------------------------------| 下面的示例显示了一个`TCP`适配器,该适配器将消息发送到通道`fromSyslog`: ``` ``` 它还展示了如何引用外部定义的连接工厂,该工厂可用于高级配置(Socket Keep-Alive 和其他用途)。有关更多信息,请参见[TCP 连接工厂](./ip.html#tcp-connection-factories)。 | |外部配置的`connection-factory`必须是`server`类型,并且端口是在那里定义的,而不是在`inbound-channel-adapter`元素本身上定义的。| |---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| 下面的示例显示了一个`TCP`适配器,该适配器将消息发送到通道`fromSyslog`: ``` ``` 前面的示例被配置为使用`RFC 5424`转换器,并且被配置为与`RFC 6587`反序列化器(RFC5424 所需)的外部定义的连接工厂的引用。