我使用简单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
丢失输出。
我没有任何logging.properties
在我的WAR文件并没有修改,我使用(标准配置standalone-full.xml
)相对于记录。 我曾经有一个logging.properties
文件,但我删除它,因为它导致所有 System.out.println
的描述,在此丢失的问题 。 一旦logging.properties
文件被删除, 一些 System.out.println
至少看到输出除权前一个例外,即当我最需要的。
我的问题是:
- 为什么我失去这个输出,我怎么能保证
System.out.println
总是包含在server.log
? - 什么是一些提示,以简化在JBoss中记录的情况呢? 整个事情非常复杂和无证。
原来还有一个logging.properties
文件虎视眈眈。 一旦我删除它,我可能会再次看到所有System.out.println
上的信息server.log
踪迹。 它仍然不明白我为什么存在logging.properties
文件应烂摊子了普通STD:OUT
输出。
更新
试图按照由詹姆斯·R·珀金斯建议尝试加入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
文件。 由于詹姆斯·R·帕金斯的暗示,这可能实际上是一个错误在JBoss的EAP 6.2.0
陶然成相同的问题,使得运算,发现此 。 它本质上说,你应该添加
<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)
您可以通过使用“标准错误”代替“标准输出”做STDERR相同。
上述结构的工作原理从而:
- 增加了第二个ConsoleHandler
- 这将只是调用的System.out.println(...)使用。
- 定义标准输出记录仪
- 这是使用JBoss的日志反正,但在这里我们明确定义,所以我们可以配置它。
- 标准输出处理程序仅添加到标准输出记录仪
- 设置使用父处理程序= false,所以我们没有得到重复的记录
- 在第二ConsoleHandler更改格式化模式,因此将只打印字符串,是 - 没有多余的格式。
这意味着,你可能不需要删除您logging.properties和的log4j.xml文件。 我们希望,这解决了这个问题。