我使用简单的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:out
和std:err
包装到自己的日志记录框架中,我假设存在某种缓冲导致System.out.println
输出丢失。< / p>
我的WAR中没有任何logging.properties
文件,并且没有修改我在日志记录方面使用的标准配置(standalone-full.xml
)。我曾经有一个logging.properties
文件,但我将其删除了,因为它会导致所有 System.out.println
丢失,如question所述。删除logging.properties
文件后,至少会看到某些 System.out.println
输出,除非在异常之前,即我最需要它时。
我的问题是:
System.out.println
中始终包含server.log
?答案 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.properties
和log4j.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执行相同的操作。
上面的配置可以这样工作:
这意味着您可能不需要删除logging.properties和log4j.xml文件。希望这可以解决问题。