我正在尝试使用 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,它也不起作用......我做错了什么吗?它似乎出于某种原因拒绝写入该套接字,但它没有抱怨任何事情。