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 所必需)的外部定義連線工廠的引用。