J2EE项目中,经常会用到很多第三方的开源组件和软件,这些组件都使用各自的日志组件,比较常用的包括slf4j,common-log, log4j等,很多老的开源软件(包括TOMCAT)使用的是JDK14-LOGGER。这些日志都有自己独立的配置,或只是其中一些可以整合。但是在项目实际部署的时候,需要把所有开源软件和项目程序的各种日志都整合到日志文件中输出,包括tomcat。

 

本文介绍使用log4j作为日志组件,commons-log, slf4j 作为整合器,同时使用slf4j桥接jdk14-logger输出到log4j日志器。总的来说,达到项目中所有使用这四中日志输出的都统一使用log4j输出。

 

1.日志需要的包依赖(maven dependency):

 

Xml代码  收藏代码
  1. <properties>
  2.     <slf4j.version>1.7.2</slf4j.version>
  3.     <log4j.version>1.2.17</log4j.version>
  4. </properties>
  5. <!– LOGGING begin –>
  6. <!– slf4j –>
  7. <dependency>
  8.     <groupId>org.slf4j</groupId>
  9.     <artifactId>slf4j-api</artifactId>
  10.     <version>${slf4j.version}</version>
  11. </dependency>
  12. <!– slf4j-log4j绑定 –>
  13. <dependency>
  14.     <groupId>org.slf4j</groupId>
  15.     <artifactId>slf4j-log4j12</artifactId>
  16.     <version>${slf4j.version}</version>
  17. </dependency>
  18. <!– common-logging 实际调用slf4j –>
  19. <dependency>
  20.     <groupId>org.slf4j</groupId>
  21.     <artifactId>jcl-over-slf4j</artifactId>
  22.     <version>${slf4j.version}</version>
  23. </dependency>
  24. <!– java.util.logging 实际调用slf4j –>
  25. <dependency>
  26.     <groupId>org.slf4j</groupId>
  27.     <artifactId>jul-to-slf4j</artifactId>
  28.     <version>${slf4j.version}</version>
  29. </dependency>
  30. <!– log4j –>
  31. <dependency>
  32.     <groupId>log4j</groupId>
  33.     <artifactId>log4j</artifactId>
  34.     <version>${log4j.version}</version>
  35. </dependency>
  36. <!– LOGGING end –>

 

 

2.log4j配置

log4j的配置较简单,使用通常的log4j.properties文件配置就可以,一般放到classes下就OK,你可以在web.xml中加入常量配置配置文件路径。该常量用于filter加载的时候加载日志配置。

 

 

Xml代码  收藏代码
  1. <!–tomcat启动,filter载入的Log4j配置文件位置 –>
  2. <context-param>
  3.     <param-name>log4jConfigLocation</param-name>
  4.     <param-value>/WEB-INF/log4j.properties</param-value>
  5. </context-param>
  6. <!–Spring默认刷新Log4j配置文件的间隔,单位为millisecond, 用于在线动态修改log4j日志 –>
  7. <context-param>
  8.     <param-name>log4jRefreshInterval</param-name>
  9.     <param-value>30000</param-value>
  10. </context-param>

一般情况下,使用Spring提供的org.springframework.web.util.Log4jConfigListener负载在tomcat启动的时候加载log4j配置托管spring的日志输出配置。

 

log4j.properties

 

Python代码  收藏代码
  1. log4j.rootCategory=INFO,stdout,logfile
  2. # Spring framework log level
  3. log4j.logger.org.springframework=INFO
  4. # spring modules log level
  5. #log4j.logger.org.springmodules=DEBUG
  6. # Hibernate log level
  7. # log4j.logger.org.hibernate=DEBUG
  8. log4j.logger.org.hibernate.SQL=DEBUG
  9. # Quartz log level
  10. #log4j.logger.org.quartz=INFO
  11. # Tomcat,commons… etc log level
  12. #log4j.logger.org.apache=INFO
  13. # Application log level
  14. #sql and execute time
  15. # log4jdbc
  16. log4j.logger.jdbc.sqltiming=INFO
  17. log4j.logger.jdbc.audit=OFF
  18. log4j.logger.jdbc.resultset=OFF
  19. log4j.logger.jdbc.sqlonly=INFO
  20. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  21. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  22. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] – <%m>%n
  23. #\u4e3b\u65e5\u5fd7\u6587\u4ef6
  24. log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
  25. log4j.appender.logfile.File=logs/intergration.log
  26. log4j.appender.logfile.DatePattern=.yyyy-MM-dd
  27. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  28. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] – <%m>%n

 

 

 

 

3. 整合日志

  • slf4j的日志会自动根据slf4j-log4j12-xxx.jar输出日志到log4j,无需配置。
  • commons-log的日志会自动根据jcl-over-slf4j转到log4j输出,无需配置
  • jdk14-logger的日志输出(如:tomcat,restlet等软件)可以根据jul-to-slf4j提供的Handler转移日志输出到slf4j,然后又slf4j转log4j输出。但是需要配置或编程方式设置

配置方式整合:

建立jdk14-logger的配置文件logger.properties.加入Hander配置:

handlers = org.slf4j.bridge.SLF4JBridgeHandler

然后在启动程序或容器的时候加入JVM参数配置JDK日志只是用SLF4JBridgeHandler处理:

-Djava.util.logging.config.file=/path/logger.properties

 

 

我不太喜欢这种方式,需要外部修改,麻烦,耦合性强。所以推荐是用编程方式。

 

编程方式:

扩展Spring提供的org.springframework.web.util.Log4jConfigListener,在TOMCAT启动的时候编程方式设置JDK的日志只是用SLF4JBridgeHandler进行处理。如果你不是WEB程序就更简单了,直接在程序MAIN方式里面设置就OK。

APP程序DEMO:

 

Java代码  收藏代码
  1. public class CommonLogAndLog4j {
  2.     private static final Log log = LogFactory.getLog(CommonLogAndLog4j.class);
  3.     private static final Logger log4jLogger = Logger.getLogger(CommonLogAndLog4j.class);
  4.     private static final java.util.logging.Logger jdkLogger = java.util.logging.Logger
  5.             .getLogger(CommonLogAndLog4j.class.getName());
  6.     private static final org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(CommonLogAndLog4j.class);
  7.     // -Djava.util.logging.config.file=D:/workshop/log-intergration/src/logging.properties
  8.     public static void main(String[] args) {
  9.         installJulToSlf4jBridge();
  10.         log.info(“CommonsLog日志输出”);
  11.         log4jLogger.info(“Log4j日志输出”);
  12.         jdkLogger.info(“JDK14日志输出”);
  13.         slf4jLogger.info(“slft4j日志输出”);
  14.     }
  15.     public static void installJulToSlf4jBridge() {
  16.         SLF4JBridgeHandler.removeHandlersForRootLogger();
  17.         SLF4JBridgeHandler.install();
  18.     }
  19. }

 

 

Webapp程序:

LoggerIntergrationListener.class

Java代码  收藏代码
  1. /**
  2.  * 扩展Spring的Log4jConfigListener,在容器启动的时候,桥接JDK14的输出到slf4j-logger
  3.  * 
  4.  * @author zhangpu
  5.  */
  6. public class LoggerIntergrationListener extends Log4jConfigListener {
  7.     @Override
  8.     public void contextInitialized(ServletContextEvent event) {
  9.         installJulToSlf4jBridge();
  10.         event.getServletContext().log(“Install Jdk-util-logger to slf4j success.”);
  11.         super.contextInitialized(event);
  12.     }
  13.     private void installJulToSlf4jBridge() {
  14.         SLF4JBridgeHandler.removeHandlersForRootLogger();
  15.         SLF4JBridgeHandler.install();
  16.     }
  17. }

 

web.xml配置

Xml代码  收藏代码
  1. <!–Intergration log4j/slf4j/commons-logger/jdk14-logger to log4j –>
  2. <listener>
  3.     <listener-class>com.feinno.framework.common.web.support.LoggerIntergrationListener</listener-class>
  4. </listener>

 

OK,over!~

本文是全系列中第3 / 6篇:Spring

互联网金融系列-支付清算体系例子-下(理解日切)

笔者上一篇《互联网金融系列-支付清算体系介绍-上》已经比较全面的介绍了以银联为例子的支付清算体系,为了更好的理解里面的运作,本章以两个例子为重点,全...

阅读全文

互联网金融系列-支付清算体系介绍-上

一,支付清算体系的简介 支付清算体系是一个国家的金融基础设施,或说公共服务。我国由央行主管此事,目前大体维持“结算-清算”二级制的支付体系。通俗地讲,...

阅读全文

JDK8 – 当尝试使用Maven生成javadoc时,错误“javax.interceptor.InterceptorBinding未找到的类文件”javadoc plugin

我使用JDK8(尝试它在我的Eclipse工作区与Win x64 u25 JDK在Linux上由Jenkins发布 – jdk-8u20-linux-x64,两个相同的问题)。我有多模块Maven项目(我从包装类...

阅读全文

欢迎留言