【问题标题】:JBoss logging (log4j) header prints on every line of wrapped entryJBoss 日志记录 (log4j) 标头打印在包装条目的每一行
【发布时间】:2014-09-18 19:48:04
【问题描述】:

以前在我们的开发环境中,我们的 JBoss 日志只会在日志条目的第一行打印 log4j 标头信息,其中该条目是包含多行的文本字符串(例如,打印长 SQL 语句) .

在过去 6 个月的某个时间点,这种情况发生了变化,现在在每一行打印该信息,这使得读取实际日志成为一场噩梦,并阻止我们从日志中复制/粘贴,因为所有标题文本。请注意,对于可能跨越多行的其他(系统生成的)事物,这不会发生在每一行。

例如,这是我们的日志当前对于 INFO 事件的样子:

14:36:14,992 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeplo
ymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean name
d ConfigurationEJB in deployment unit subdeployment "JassEJB3.jar" of deployment
 "jassejb.ear" are as follows:

        java:global/jassejb/JassEJB3/ConfigurationEJB!jass.response.ejb3.active.
ConfigurationLocal
        java:app/JassEJB3/ConfigurationEJB!jass.response.ejb3.active.Configurati
onLocal
        java:module/ConfigurationEJB!jass.response.ejb3.active.ConfigurationLoca
l
        java:global/jassejb/JassEJB3/ConfigurationEJB!jass.response.ejb3.active.
ConfigurationRemote
        java:app/JassEJB3/ConfigurationEJB!jass.response.ejb3.active.Configurati
onRemote
        java:module/ConfigurationEJB!jass.response.ejb3.active.ConfigurationRemo
te
        java:jboss/exported/jassejb/JassEJB3/ConfigurationEJB!jass.response.ejb3
.active.ConfigurationRemote

这(上图)是我们希望它如何查找我们通过代码发送的日志(即打印堆栈跟踪、SQL 语句等)。为了比较,这是发送到日志的堆栈跟踪的样子:

14:36:57,142 INFO  [stdout] (EJB default - 2520) -------- BEGIN OF STACK TRACE -
-------- 
14:36:57,142 ERROR [stderr] (EJB default - 2520) java.sql.SQLRecoverableExceptio
n: Closed Connection
14:36:57,143 ERROR [stderr] (EJB default - 2520)        at oracle.jdbc.driver.Ph
ysicalConnection.prepareCall(PhysicalConnection.java:3416)
14:36:57,144 ERROR [stderr] (EJB default - 2520)        at org.jboss.jca.adapter
s.jdbc.BaseWrapperManagedConnection.doPrepareCall(BaseWrapperManagedConnection.j
ava:740)
14:36:57,144 ERROR [stderr] (EJB default - 2520)        at org.jboss.jca.adapter
s.jdbc.BaseWrapperManagedConnection.prepareCall(BaseWrapperManagedConnection.jav
a:726)
14:36:57,144 ERROR [stderr] (EJB default - 2520)        at org.jboss.jca.adapter
s.jdbc.WrappedConnection.prepareCall(WrappedConnection.java:597)

有谁知道我们如何禁止记录器在每一行上插入“14:36:57,144 ERROR [stderr](EJB 默认 - 2520”)?看起来它正在这样做,因为每一行都是单独发送的。我感觉 SyslogAppender 以某种方式导致这种情况发生(拆分字符串),但我不知道如何补救这种情况。

谁能提供任何见解?谢谢!

【问题讨论】:

    标签: design-patterns logging jboss log4j


    【解决方案1】:

    有谁知道我们如何禁止记录器在每一行插入“14:36:57,144 ERROR [stderr](EJB 默认 - 2520”)?

    jboss-logj.xml 文件中你可以配置每个日志行的格式。 你会发现类似的东西(它可能因一个 JBoss 版本而异):

    <layout class="org.apache.log4j.PatternLayout">
        <!-- The default pattern: Date Priority [Category] Message\n -->
        <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n"/>
    
        <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
        <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
          -->
    </layout> 
    

    ConversionPattern 属性确定每行的格式。您可以根据需要添加/删除信息,使用不同的 characters conversion.

    【讨论】:

      【解决方案2】:

      我认为这里的问题是堆栈跟踪被发送到 stderr。据我所知,在 JBoss 中,stdout/stderr 拦截器总是将每一行转换为日志条目。

      解决方案是确保字符串是通过日志系统发送的,而不是 System.out 或 System.err。

      例如,而不是:

      e.printStackTrace();
      

      使用这个:

      log.error("Unexpected exception", e);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 2013-08-15
        相关资源
        最近更新 更多