记录System.out.println迷失在JBoss中

时间:2017-01-28 01:20:53

标签: java logging jboss jboss6.x

我使用简单的System.out.printf / System.out.println语句来执行JBoss日志记录(我正在部署到JBoss EAP 6.2)。我注意到,当发生异常时,我倾向于在抛出异常之前立即丢失println个消息。这使得无法调试异常。

为了验证这一点,我在WAR中输入了以下代码:

 System.out.println("foo");
 int i = 0; if (i==0) throw new RuntimeException();
 ...

int i = 0; if (i==0)部分只是为了使编译器静音,否则会抱怨)

确实,当执行此代码时,在服务器的日志文件(standalone/log/server.log)中,我根本看不到foo。我看到了异常的报告,但没有上面的内容。

我尝试在循环中打印相同的消息100次,在抛出异常之前显式执行System.out.flush()并执行java.util.concurrent.TimeUnit.MINUTES.sleep(1)。没有任何改变,server.log中根本没有输出。只显示异常跟踪,但在其上方没有foo

我理解JBoss将std:outstd:err包装到自己的日志记录框架中,我假设存在某种缓冲导致System.out.println输出丢失。< / p>

我的WAR中没有任何logging.properties文件,并且没有修改我在日志记录方面使用的标准配置(standalone-full.xml)。我曾经有一个logging.properties文件,但我将其删除了,因为它会导致所有 System.out.println丢失,如question所述。删除logging.properties文件后,至少会看到某些 System.out.println输出,除非在异常之前,即我最需要它时。

我的问题是:

  1. 为什么我会丢失此输出?如何确保System.out.println中始终包含server.log
  2. 有哪些提示可以简化JBoss中的日志记录情况?整件事非常复杂,没有文件记载。

2 个答案:

答案 0 :(得分:0)

原来还有另一个logging.properties文件潜伏着。删除后,我可以再次查看System.out.println路径上的所有server.log条消息。我仍然不清楚为什么logging.properties文件的存在应该与普通的STD:OUT输出相混淆。

更新

尝试按照 James R. Perkins 的建议尝试在我的jboss-deployment-structure.xml目录中添加META-INF文件,以禁用记录子系统处理我的组件并添加以下内容:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">   
   <deployment>
    <exclusions>
     <module name="org.jboss.logging"/>
     <module name="org.apache.log4j"/>
    </exclusions>
   </deployment>
</jboss-deployment-structure>

......这没用。 System.out.println输出仍然丢失。因此,唯一的解决方法是删除logging.propertieslog4j.xml文件。感谢 James R. Perkins 建议这实际上可能是JBoss EAP 6.2.0中的bug

答案 1 :(得分:-1)

遇到与op相同的问题,发现this。本质上说您应该添加

<console-handler name="STDOUT">
  <level name="INFO"/>
  <formatter>
    <pattern-formatter pattern="%s%E%n"/>
  </formatter>
</console-handler>
<logger category="stdout" use-parent-handlers="false">
  <level name="INFO"/>
  <handlers>
    <handler name="STDOUT"/>
  </handlers>
</logger>

通过standalone.xml或domain.xml或使用CLI到JBoss日志记录子系统,您可以执行以下操作:

/subsystem=logging/console-handler=STDOUT:add(level=INFO,formatter="%s%E%n")
/subsystem=logging/logger=stdout:add(level=INFO,handlers=[handler=STDOUT],use-parent-handlers=false)

您可以通过将“ stdout”替换为“ stderr”来对STDERR执行相同的操作。

上面的配置可以这样工作:

  • 添加第二个ConsoleHandler
  • 这将仅用于调用System.out.println(...)。
  • 定义标准输出记录器
  • 无论如何,JBoss Logging都会使用它,但是这里我们明确定义它,以便我们对其进行配置。
  • 仅将STDOUT处理程序添加到stdout记录器
  • 设置use-parent-handler = false,这样我们就不会重复记录
  • 在第二个ConsoleHandler中更改格式化程序模式,以使其仅按原样打印字符串-无需额外格式化。

这意味着您可能不需要删除logging.properties和log4j.xml文件。希望这可以解决问题。