有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

与logstash一起使用时,在log4j上阻止了java

我的java程序有这样的技术堆栈:
Tomcat+log4j+logstash+ElasticSearch
log4j使用SocketAppender将日志发送到logstash,然后logstash将输出写入elasticsearch
问题是,在运行几个小时后,java应用程序将被阻塞。几个线程在写入log4j时被阻塞。当我关闭logstash和elasticsearch时,应用程序将恢复
我认为这应该与elasticsearch的性能有关,但我不知道如何解决它


共 (2) 个答案

  1. # 1 楼答案

    问题在于Logstash——当elasticsearch无法接收数据时,它会阻止输入插件(log4j输入)

    可能的解决方法-启用Persistent Queues。但这并不理想,你的应用迟早会再次被意外屏蔽。所以千万不要直接将日志从log4jv1发送到logstash

    我没有为log4j v1找到任何解决方案,我必须在log4j和logstasth TCP输入之间编写小型非阻塞代理

  2. # 2 楼答案

    可能与log4j SocketAppender有关,请参见herehere

    如果使用log4j2,它有一个异步Appender,这可能很有用

    也许你可以做相反的事情,看看是logstash+ES还是tomcat+yourapp(即log4j)端被锁定:只关闭应用程序,看看重启tomcat时logstash进程是否处理输入。如果您的日志进入elasticsearch,那么问题很有可能出现在tomcat端——虽然不能保证,但关闭套接字可能会解决问题——这是一个很好的猜测

    其他建议:

    • 在tomcat服务器或线程转储分析器上使用jvisualvm(参见上面的SO链接)
    • 在命令行中添加stdout或debug输出,启动logstash,查看是否有有用的消息

    阿兰