在不调整log4j.xml的情况下记录jboss

在不调整log4j.xml的情况下记录jboss,jboss,log4j,jmx,Jboss,Log4j,Jmx,我们正在运行带有JBoss和log4j的服务器来查找错误。我被要求想出一种方法来记录freememory和active thread group count之类的内容,这样我们就可以在不必通过jboss控制台的情况下监控这些内容。但是,有人告诉我,如果我能够做到这一点而不必对现有服务器进行任何更改,我会更愿意这样做。我最初的想法是更改log4j.xml,将相关数据持久化到数据库中,以便稍后解析并显示,但现在我真的不知道。 在不安装第三方应用程序的情况下,有没有其他方法可以自动从jboss服务器获

我们正在运行带有JBoss和log4j的服务器来查找错误。我被要求想出一种方法来记录freememory和active thread group count之类的内容,这样我们就可以在不必通过jboss控制台的情况下监控这些内容。但是,有人告诉我,如果我能够做到这一点而不必对现有服务器进行任何更改,我会更愿意这样做。我最初的想法是更改log4j.xml,将相关数据持久化到数据库中,以便稍后解析并显示,但现在我真的不知道。 在不安装第三方应用程序的情况下,有没有其他方法可以自动从jboss服务器获取信息并将其持久化?或者我应该继续争取允许修改log4jxml吗? 还有,这可能吗?我已经找遍了所有的例子,但是没有一个地方特别说明可以使用log4j来记录系统统计数据。

Hunter

假设没有网络障碍,并且没有以任何方式禁用JMX远程处理,则可以使用JMX API远程监视这些值。这里有一些Groovy代码可以做到这一点,但您可以轻松地将其转换为Java

import javax.management.*;
import javax.naming.*;
Properties p = new Properties();
p.put(Context.PROVIDER_URL, url);
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put("jnp.disableDiscovery", "true");
ctx = new InitialContext(p);
contexts.put(url, ctx);
mbeanServer = ctx.lookup("/jmx/rmi/RMIAdaptor");
// Lookups here
/client/jbossall client.jar放在类路径中

现在只需滚动JMXConsole(如果必须的话,可以在Dev服务器上)并选择要收集的属性和ObjectName。例如,扩展上面的示例以获得FreeMemory(再次使用groovy):

在JMXConsole中,映射到此MBean的:

对于该MBean中的此属性:

因此,如果您设置了一个调度程序来随时收集这些数据,您可以将其写入数据库,放入电子邮件或其他任何形式


有意义吗?

哇,非常感谢你的深入和有用的回答,尼古拉斯!虽然Groovy代码的第一部分中的一些内容乍一看对我来说是相当陌生的,但从逻辑的角度来看,这一切都是有意义的,而且我确信我可以找出java中的等价物。我现在唯一的问题是,在p.put(Context.PROVIDER\u url,url)行中,url的值是多少;?jmx控制台的url?默认情况下,它将是主机:1099
import javax.management.*;
def objectName = new ObjectName("jboss.system:type=ServerInfo");
def freeMem = mbeanServer.getAttribute(objectName, "FreeMemory");