JBoss上未生成java线程转储
我曾经通过运行kill-quit生成线程转储,并将它们保存在服务器日志所在的日志文件中。当文件变得太大时,我使用rm将其删除,并创建了一个同名的新文件。 现在,当我使用kill-quit进行线程转储时,日志文件中不会复制任何内容——它是空的
有人能帮忙吗
你可以在下面搜索框中键入要查询的问题!
我曾经通过运行kill-quit生成线程转储,并将它们保存在服务器日志所在的日志文件中。当文件变得太大时,我使用rm将其删除,并创建了一个同名的新文件。 现在,当我使用kill-quit进行线程转储时,日志文件中不会复制任何内容——它是空的
有人能帮忙吗
# 1 楼答案
如果这是on*nix,当你删除一个文件时,仍然打开该文件的所有人都将继续写入旧的(现在丢失的)文件。只有在关闭所有文件句柄时,才会真正删除该文件
您必须使JVM关闭并重新打开日志文件。不确定这是否可以在不重启的情况下完成
# 2 楼答案
Unix上的默认JBoss启动脚本通常如下所示:
这很不幸,因为它将stderr发送到/dev/null。通常这不是问题,因为一旦log4j初始化,大多数应用程序输出将进入引导状态。日志或服务器。日志然而,对于线程转储和其他低级错误,它们会丢失
最好是更改启动脚本,将stdout和stderr重定向到一个文件。此外,默认设置中忽略的一件事是重定向stdin。对于守护进程,最好将stdin重定向到/dev/null。例如:
最后,如果您有一个正在运行的进程,那么可以使用JRE附带的
jstack
来获取线程转储。这将输出到调用它的控制台。我更喜欢kill -3
的输出,但是jstack
也允许您查看本机堆栈帧# 3 楼答案
如果你进入jmx找到jboss。system:service=Logging,type=log4jsservice然后您可以调用reconfigure方法,该方法将导致log4j重新打开其任何日志文件。那么,杀戮-放弃应该会起作用