我正在尝试使用ELK堆栈实现一个集中式日志服务器:Elasticsearch,Logstash,Kibana。它将从许多应用程序接收日志。基本上我有一个使用具有以下配置的登录的Tomcat应用程序:
<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发送所有日志...在my_remote_host我部署了 elasticsearch、logstash 和 kibana。它们似乎都有效。这是日志的配置:
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发送任何数据。即使使用简单的套接字Appender,它也不起作用...我做错了什么吗?出于某种原因,它似乎拒绝写入该套接字,但它并没有抱怨任何事情。
在 catalina.out 中查找 logbacks 启动日志。 还要确保您没有任何防火墙(如果您在 AWS 中,则为安全组)
从Tomcat/logback向logstach发送日志时,我也使用不同的编解码器
tcp {
port => 4560
codec => json_lines
tags => ["app"]
}
我在过滤器和输出部分中使用此标签,因为 logback 正在消耗来自多个位置的日志。
我对解决方案有点晚了,因为我今天遇到了同样的问题。以防将来有其他人遇到类似的问题。
我设置了登录<configuration debug="true">
您会注意到它无法写入输出流。所以我查找了 LogstashEncoder 使用的 Logback 库版本,它们是 1.1.6 的旧版本,而我使用的是 1.2.1。我切换到旧版本,一切正常。