通常我们再编程时会引入很多第三方jar包,我们维护时一般情况下只关注我们自己的代码日志,但当第三方jar包出现异常时,同样需要关注,故我们期望日志按如下场景输出:
假设存在两个类:
log.open.test.log4j.LevelTest  (业务代码)
log.a.LogA  (引入的第三方代码)
如果想要将log.open包下的所有info级别的日志输出记录run.log中,其他路径下的日志如果出现error就输出到控制台,似乎通过log4j的配置搞不定啊,跪求大神的解决方案:我做了如下测试,没有找到方法,有没有大神碰到类似的场景并解决的:log4j配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m %n" />
</layout>
</appender>

<appender name="RUN_LOG"
class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logs/run.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n" />
</layout>
</appender>

<category name="log.open"> 
<priority value="INFO" />
<appender-ref ref="RUN_LOG" />
</category> <root>
<priority value="ERROR" />
<appender-ref ref="STDOUT" />
</root></log4j:configuration>2个测试类:
package log.a;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class LogA
{
    private static Log logger = LogFactory.getLog(LogA.class);
    
    public static void work()
    {
        logger.error("we face a exception!");
    }
    
}package log.open.test.log4j;import log.a.LogA;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class LevelTest
{
    private static Log logger = LogFactory.getLog(LevelTest.class);
    
    public void work()
    {
        logger.info("ok, try to invoke LogA");
        
        LogA.work();
        
    }
    
    public static void main(String[] args)
    {
        
        LevelTest test = new LevelTest();
        test.work();
    }
    
}
执行LevelTest类main方法,期望在控制台只输出:
we face a exception! 实际控制台输出了:
ok, try to invoke LogA 
we face a exception! log4j日志

解决方案 »

  1.   

    找到解决方案了,可以配置appender 的Threshold属性,控制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="STDOUT" class="org.apache.log4j.ConsoleAppender">
      <param name="Threshold" value="ERROR" />  <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%m %n" />
      </layout>
     </appender>
     
     <appender name="RUN_LOG"
      class="org.apache.log4j.DailyRollingFileAppender">
      <param name="File" value="logs/run.log" />
      <param name="Append" value="true" />
      <param name="MaxFileSize" value="10MB" />
      <param name="MaxBackupIndex" value="10" />
      <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n" />
      </layout>
     </appender>
     
     <category name="log.open"> 
      <priority value="INFO" />
      <appender-ref ref="RUN_LOG" />
     </category> <root>
      <priority value="ERROR" />
      <appender-ref ref="STDOUT" />
     </root></log4j:configuration>