# syslog 支持

## syslog 支持

Spring Integration2.2 引入了 syslog 转换器：`SyslogToMapTransformer`。

你需要在项目中包含此依赖项：

Maven

```
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-syslog</artifactId>
    <version>5.5.9</version>
</dependency>
```

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 中描述的不同帧技术，<br/>适配器需要一个配置有`RFC6587SyslogDeserializer`的 TCP 连接工厂，<br/>默认情况下，这个反序列化器通过使用 LineFeed 来分隔 syslog 消息来处理`octet counting`和`non-transparent framing`。<br/>当未检测到`octet counting`时，它使用`ByteArrayLfSerializer`。<br/>来使用不同的`non-transparent`帧，你可以为它提供一些其他的反序列化器。<br/>虽然反序列化器可以同时支持`octet counting`和`non-transparent framing`，但只支持后者的一种形式。<br/>如果`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 入站通道适配器属性](./ip.html#ip-udp-ib-atts)中所定义的。

|   |当使用`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" />
```

它还展示了如何引用外部定义的连接工厂，该工厂可用于高级配置（Socket Keep-Alive 和其他用途）。有关更多信息，请参见[TCP 连接工厂](./ip.html#tcp-connection-factories)。

|   |外部配置的`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`反序列化器（RFC5424 所需）的外部定义的连接工厂的引用。