0

我試圖以JSON格式將Syslog日誌記錄到Syslog,但是我發現Syslog標頭未按預期設置的奇怪問題。logback logstash編碼器系統日誌標頭未設置

我在Mac上測試這一點,並使用Wireshark來抓取

我logback.xml如下,因爲他們獲取發送到UDP端口514(通過loopback接口)數據包:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/> 

    <appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender"> 
    <host>localhost</host> 
    <port>514</port> 
    <prefix class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
     <pattern>%syslogStart{LOCAL5}</pattern> 
     </layout> 
    </prefix> 
    </appender> 

    <root level="INFO"> 
    <appender-ref ref="stash"/> 
    </root> 
</configuration> 

和當我看到的Wireshark輸出I只看到JSON被記錄(未給出PRI報頭字段)

[truncated]Syslog message: (unknown): {"@timestamp":"2016-03-22T12:13:37.270+11:00","@version":1,"message":"Started App in 4.327 seconds (JVM running for 4.92)","logger_name":"au.com.xxx.App","threa 

如果我切換到標準的logback系統日誌附加器(非JSON輸出)

... 
    <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> 
    <syslogHost>127.0.0.1</syslogHost> 
    <Facility>LOCAL5</Facility> 
    <SuffixPattern>%-5level MyApp %logger %msg</SuffixPattern> 
    </appender> 
... 

我看到正確的標頭設施原始值< 174>並解析值是必需的系統日誌頭中的Wireshark的分組

Syslog message: LOCAL5.INFO: Mar 22 12:31:03 sbmelmac-06390.local INFO App au.com.App Started App in 11.292 seconds (JVM running for 29.336) 

LOCAL5.INFO(在syslog CONF)到將日誌消息路由到正確的文件,所以沒有這個我不能過濾出基於設施過濾器的日誌條目。

我使用SpringBoot(1.2.7),(使用的logback 1.1.3),apache的駱駝(2.16.1)和logstash-的logback編碼器(4.6)

當我在調試運行它看起來像SyslogStartConverter.convert方法永遠不會被調用。

乾杯 羅伊

回答

0

很多頭部劃傷後,它看起來像它與示例的包裝LayoutWrappingEncoder部分的問題。

當我使用最新的SpringBoot版本時,logback配置異常會阻止應用程序啓動(以前的版本並未停止應用程序的啓動,即使引發異常也是如此)。

Application startup failed 
java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in [email protected] - A "ch.qos.logback.core.encoder.LayoutWrappingEncoder" object is not assignable to a "ch.qos.logback.core.Layout" variable. 
ERROR in [email protected] - The class "ch.qos.logback.core.Layout" was loaded by 
ERROR in [email protected] - [[email protected]] whereas object of type 
ERROR in [email protected] - "ch.qos.logback.core.encoder.LayoutWrappingEncoder" was loaded by [[email protected]]. 

,所以如果我去掉包裝LayoutWrappingEncoder並使用前綴用的模式實現,代碼工作,我看到在系統日誌標題正確的設施細節。

<conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/> 
<appender name="JSON_SYSLOG" class="net.logstash.logback.appender.LogstashSocketAppender"> 
    <host>127.0.0.1</host> 
    <port>514</port> 
    <prefix class="ch.qos.logback.classic.PatternLayout"> 
     <pattern>%syslogStart{LOCAL5}</pattern> 
    </prefix> 
    </appender> 

,將所得的Wireshark分組具有的設施信息(LOCAL5.INFO | ERROR)

[truncated]Syslog message: LOCAL5.INFO: Mar 22 14:12:18 sbmelmac-06390.local {"@timestamp":"2016-03-22T14:12:18.494+11:00","@version":1,"message":"Started App in 4.597 seconds (JVM running for 5.18)","logger":"au.com.myapp.