Logstash通过TCP获取log4j日志

  • Post author:
  • Post category:其他


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
   }
 }



版权声明:本文为u014527058原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。