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

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

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

  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加载的时候加载日志配置。

  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>
  10. </context-param>

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

log4j.properties

  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:

  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

  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配置

  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!~

log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)的更多相关文章

  1. Log4J日志整合及配置详解

    Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...

  2. MongoDB log4j 日志整合

    在分布式系统当中,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理.而这个储存日志 ...

  3. Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明

    Log4j  Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...

  4. 记一次log4j日志文件输出错误的解决

    log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ]. 起因:部门网站使用B ...

  5. log4j日志文件输出保存

    og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appe ...

  6. log4j日志不输出的问题

    今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了.从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论. 先说一下 ...

  7. log4j日志不输出MyBatis SQL脚本?

    日志输出级别调成debug,然并卵? 试试加下这个包. <dependency> <groupId>org.slf4j</groupId> <artifact ...

  8. Java日志框架SLF4J和log4j以及logback的联系和区别

    1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...

  9. log4j日志输出到web项目指定文件夹

    感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/ 摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导 ...

随机推荐

  1. Spring mvc接收中文参数值乱码(tomcat配置问题)

    问题| 使用java写的接口,中文参数乱码   问题分析| 请求方打印参数日志,中文无问题,tomcat中日志显示接收的参数乱码   实际是tomcat配置问题   解决方法| 在tomcat的配置文 ...

  2. AdminLTE 侧边栏收缩时触发的事件

    点击此处,会触发 expanded.pushMenu 或 collapsed.pushMenu 事件 如果需要在事件触发时编写相关逻辑,可用如下方式 $("body").on(&q ...

  3. hibernate 中,出现了错误 "node to traverse cannot be null!" 如何改正

    这个错误基本上是因为hql语句写错了而造成的, 返回找hql输出一下发现, hql语句中间少了几个空格, 写成了String hql = "from"+className+&quo ...

  4. c# double 类型保留几位小数

    C 或 c :货币 D 或 d:十进制数 E 或 e:科学记数法(指数) F 或 f:定点 G 或 g:常规 N 或 n:数字 P 或 p:百分比 double.ToString("Nx & ...

  5. @ResponseBody使用须知

    -------------------siwuxie095 @ResponseBody 使用须知 使用 @ResponseBody 注解映射响应体 @ResponseBody 注解可被应用于方法上,标 ...

  6. 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理

    前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...

  7. [Java学习]面向对象-super关键字;final关键字

    super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...

  8. java中关于null的一些理解

    1.null是Java中的关键字,像public.static.final.它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错. 2.null是任何引用类型的默认值 ...

  9. java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式

    在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synch ...

  10. 实现Hibernate框架的CRUD

    1.创建Web项目HS_test如图所示: 2.创建数据库DBHSTest,在数据库中创建表Teacher,并插入数据 3.在Myeclipse中调出DB Brower视图 右键->New: 连 ...