修改附加日志记录的log4j的最佳方法

Gan*_*row 8 java log4j jboss5.x

我目前正在开发大型(功能明智的)休息网络服务,我想捕获日志非常好,所以我可以很好地了解发生了什么.现在我使用log4j进行日志记录,使用这个附加设置:

<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

它产生这些日志:

10:44:55,893 INFO  [STDOUT] INFO : my.package.MyClass - I'm class message
Run Code Online (Sandbox Code Playgroud)
  1. 我怎样才能使这条消息看起来像ie

    10:44:55,893 INFO : my.package.MyClass - I'm class message
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我可以制作一个特殊的appender或它是什么,并在一些类中使用它,而不是所有的,即我想在我的几个日志中有这个:

    • Payload: some request parameters
    • Response: some response that my service returns
    • extra data : some extra data

没有这些 INFO [STDOUT] INFO my.package.MyClass in front of it

UPDATE

我忘记在问题中提到我正在使用Jboss 5.我认为jboss可能会添加10:44:55,893 INFO [STDOUT]到我放在log4j配置中的任何格式.

BOUNTY UPDATE

我改变了这个:

<!-- ============================== -->
   <!-- Append messages to the console -->
   <!-- ============================== -->

   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="Target" value="System.out"/>
      <param name="Threshold" value="INFO"/>

      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
      </layout>
   </appender>
Run Code Online (Sandbox Code Playgroud)

对此:

<!-- ============================== -->
   <!-- Append messages to the console -->
   <!-- ============================== -->

       <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
          <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
          <param name="Target" value="System.out"/>
          <param name="Threshold" value="INFO"/>

          <layout class="org.apache.log4j.PatternLayout">
             <!-- The default pattern: Date Priority [Category] Message\n -->
             <param name="ConversionPattern" value="%m%n"/>
          </layout>
       </appender>
Run Code Online (Sandbox Code Playgroud)

它有效,但这样做似乎有点难看.还有其他方法吗?我正在使用spring MVC/JBoss组合.

我现在得到了很好的干净消息:

10:44:55,893 INFO : my.package.MyClass - I'm class message
Run Code Online (Sandbox Code Playgroud)

没有烦恼

10:44:55,893 INFO  [STDOUT]
Run Code Online (Sandbox Code Playgroud)

字首

pro*_*kel 7

问题1:

为appender使用以下模式布局:

<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />
Run Code Online (Sandbox Code Playgroud)

您声明的配置文件中的转换模式不会导致您声明的日志类型.例如,日期/时间不包含在转换模式中.


问题2:

您可以使用一个特殊的记录器,它使用另一个只记录纯消息的appender.

您的配置将如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
        </layout>
    </appender>

    <appender name="consoleAppender2" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />
        </layout>
    </appender>

    <logger name="specialLogger" additivity="false">
        <level value="INFO" />
        <appender-ref ref="consoleAppender" />
    </logger>

    <root>
        <priority value="INFO" />
        <appender-ref ref="consoleAppender2" />
    </root>

</log4j:configuration>
Run Code Online (Sandbox Code Playgroud)

您可以将specialLogger用于纯消息,而无需其他信息.它可以用于多个类.

在specialLogger的配置中,additivity = "false"需要,因为否则consoleAppender2根记录器的appender 也会记录相同的消息.(在这种情况下,消息将被记录两次.)

例如,您的代码可能如下所示:

public class TestClassA
{
    private static Logger specialLogger = Logger.getLogger("specialLogger");
    private static Logger logger = Logger.getLogger(TestClassA.class);    

    public TestClassA() {

    }

    public void doSomething() {
        logger.info("Some message from TestClassA");
        specialLogger.info("Some message via the specialLogger from TestClassA");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用doSomething会导致:

17:17:18,125 INFO : com.foo.TestClassA - Some message from TestClassA
Some message via the specialLogger from TestClassA
Run Code Online (Sandbox Code Playgroud)

在主类的某个地方,您需要像往常一样配置log4j,例如:

DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000);
Run Code Online (Sandbox Code Playgroud)