将Tomcat日志发送到Logstash

时间:2015-04-14 14:37:56

标签: java tomcat logback logstash logstash-logback-encoder

我正在尝试使用ELK堆栈实现集中式日志服务器:Elasticsearch,Logstash,Kibana。它将从许多应用程序接收日志。 基本上我有一个Tomcat应用程序,它使用具有以下配置的logback:

<appender name="ROLLING"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    [...]
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %-5level %logger - %msg%n</pattern>
    </encoder>
</appender>


<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <remoteHost>my_remote_host</remoteHost>
    <port>5000</port>

    <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>


<root level="DEBUG">
    <appender-ref ref="ROLLING" />
    <appender-ref ref="STDOUT" />
    <appender-ref ref="stash" />
</root>

所以理论上这应该通过TCP发送logback记录的所有内容...... 在my_remote_host上,我部署了elasticsearch,logstash和kibana。他们似乎都工作。 这是logstash的配置:

input {
  stdin {
    type => "human"
  }
  tcp {
    port => 5000
    codec => "json"
    mode => "server"
  }
}

output {
  stdout {}
  elasticsearch {
    host => "my_remote_host"
  }
}

如果我在logstash实例中输入stdin的内容,它会成功索引我的输入。此外,如果我通过http向my_remote_host:5000发送请求,它会成功记录它收到的数据。

问题是logback似乎没有使用LogstashTcpSocketAppender发送任何数据。即使使用简单的SocketAppender,它也行不通......我做错了什么?它出于某种原因似乎拒绝写入该套接字,但它并没有抱怨什么。

2 个答案:

答案 0 :(得分:1)

查看catalina.out以获取logbacks启动日志。还要确保你没有防火墙(如果你在ws中有安全组)

在将日志从tomcat / logback发送到logstach

时,我也使用不同的编解码器
    tcp {
      port => 4560
      codec => json_lines
      tags => ["app"]
    }

我在过滤器和输出部分中使用此标记,因为logback正在使用来自多个地方的日志。

答案 1 :(得分:0)

我对解决方案的反应迟钝,因为我今天面临同样的问题。如果其他人在将来面临类似的问题。

我设置了logback <configuration debug="true">

您会注意到它无法写入OutputStream。所以我查找了LogstashEncoder使用的Logback库的版本,它们是旧版本的1.1.6,我使用的是1.2.1。我切换到旧版本,一切正常。