1. 程式人生 > >Logstash通過TCP獲取log4j日誌

Logstash通過TCP獲取log4j日誌

Logstash的Input中有一個tcp外掛,可以通過監聽某一個主機上的特定埠來獲取日誌。大部分的日誌庫(logback,log4j,commons-logging乃至java自帶的java.util.Logging)都支援將日誌通過Socket方式輸出。對於log4j,可以通過SocketAppender來實現將日誌以Socket方式輸出。

但是這樣會有一個問題,log4j的SocketAppender與其他日誌庫的Socket方案稍有不同,log4j的SocketAppender會自動將包含日誌的字串物件進行序列化,而不像其他日誌庫那樣直接傳送raw內容,這樣就會導致Logstash收到的日誌變成一堆亂碼,根本沒法解析。其實對於這個問題,倒是有一個方法,那就是直接重寫SocketAppender,把序列化的過程去掉,但是這樣做未免太過麻煩。實際上官方已經想到了這個問題,並提供瞭解決方案。這個解決方案就是在input中使用官方提供的log4j外掛,具體如下。

log4j.properties內容:

log4j.rootCategory=INFO,Logstash
# Logstash appender
log4j.appender.Logstash=org.apache.log4j.net.SocketAppender
log4j.appender.Logstash.RemoteHost=localhost
log4j.appender.Logstash.port=4560
log4j.appender.Logstash.Threshold=INFO
log4j.appender.Logstash.ReconnectionDelay=60000
log4j.appender.Logstash.LocationInfo=true

logstash配置檔案內容:
 input {
     log4j {
         port => 4560
     }
 }
 
 output{
   elasticsearch { 
      hosts => ["localhost:9200"] 
      index => "logstash-%{+YYYY.MM.dd}"
      workers => 8
   }
   stdout {
      codec => dots
   }
 }