日志记录的System.out.println迷失在JBoss中(logging System.ou

2019-09-29 19:58发布

我使用简单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丢失输出。

我没有任何logging.properties在我的WAR文件并没有修改,我使用(标准配置standalone-full.xml )相对于记录。 我曾经有一个logging.properties文件,但我删除它,因为它导致所有 System.out.println的描述,在此丢失的问题 。 一旦logging.properties文件被删除, 一些 System.out.println至少看到输出除权前一个例外,即当我最需要的。

我的问题是:

  1. 为什么我失去这个输出,我怎么能保证System.out.println总是包含在server.log
  2. 什么是一些提示,以简化在JBoss中记录的情况呢? 整个事情非常复杂和无证。

Answer 1:

原来还有一个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.propertieslog4j.xml文件。 由于詹姆斯·R·帕金斯的暗示,这可能实际上是一个错误在JBoss的EAP 6.2.0



Answer 2:

陶然成相同的问题,使得运算,发现此 。 它本质上说,你应该添加

<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文件。 我们希望,这解决了这个问题。



文章来源: logging System.out.println getting lost in JBoss