我正在尝试使用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,它也行不通......我做错了什么?它出于某种原因似乎拒绝写入该套接字,但它并没有抱怨什么。
答案 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。我切换到旧版本,一切正常。