Logstash通過TCP獲取log4j日誌
阿新 • • 發佈:2019-02-06
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
}
}