3

我正在尝试使用 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 实例中向标准输入输入内容,它会成功索引我的输入。此外,如果我通过 http 向 my_remote_host:5000 发送请求,它会成功记录它接收到的数据。

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

4

2 回答 2

1

在 catalina.out 中查找 logbacks 启动日志。还要确保您没有任何防火墙(或安全组,如果您在 aws 中)

从tomcat / logback发送日志到logstach时,我也使用不同的编解码器

    tcp {
      port => 4560
      codec => json_lines
      tags => ["app"]
    }

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

于 2017-05-26T22:55:58.370 回答
0

我的解决方案有点晚了,因为我今天遇到了同样的问题。以防其他人将来遇到类似问题。

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

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

于 2017-02-16T12:26:50.587 回答