我曾经通过运行 kill -quit 来生成线程转储,我会将它们放在我的服务器日志所在的日志文件中。当文件变得太大时,我使用 rm 将其删除并创建了一个同名的新文件。现在,当我使用 kill -quit 进行线程转储时,日志文件中没有任何内容被复制 - 它是空的。
任何人都可以帮忙吗?
我曾经通过运行 kill -quit 来生成线程转储,我会将它们放在我的服务器日志所在的日志文件中。当文件变得太大时,我使用 rm 将其删除并创建了一个同名的新文件。现在,当我使用 kill -quit 进行线程转储时,日志文件中没有任何内容被复制 - 它是空的。
任何人都可以帮忙吗?
Unix 上的默认 JBoss 启动脚本通常如下所示:
nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >/dev/null 2>&1 &
这是不幸的,因为它将标准错误发送到 /dev/null。通常这不是问题,因为一旦 log4j 初始化,那么大多数应用程序输出将转到 boot.log 或 server.log。但是,对于线程转储和其他低级错误,它们会丢失。
最好的办法是更改启动脚本以将 stdout 和 stderr 重定向到文件。此外,默认设置中忽略的一件事是重定向标准输入。对于守护进程,最好将标准输入重定向到 /dev/null。例如:
nohup $JBOSS_HOME/bin/run.sh $JBOSS_OPTS >> console-$(date +%Y%m%d).out 2>&1 < /dev/null &
最后,如果您有一个正在运行的进程,您可以使用jstack
JRE 中包含的 来获取线程转储。这将输出到调用它的控制台。我更喜欢 的输出kill -3
,但jstack
也允许您查看本机堆栈帧。
如果这是在 *nix 上,当您删除一个文件时,仍然打开该文件的每个人都将继续写入旧的(现在丢失的)文件。只有当所有文件句柄都关闭时,该文件才会真正被删除。
您必须使 JVM 关闭并重新打开日志文件。不知道这是否可以在不重新启动的情况下完成。
如果你进入 jmx 并找到 jboss.system:service=Logging,type=Log4jService 你可以调用 reconfigure 方法,这会导致 log4j 重新打开它的任何日志文件。然后 kill -quit 应该可以工作。