J2EE项目中,经常会用到很多第三方的开源组件和软件,这些组件都使用各自的日志组件,比较常用的包括slf4j,common-log, log4j等,很多老的开源软件(包括TOMCAT)使用的是JDK14-LOGGER。这些日志都有自己独立的配置,或只是其中一些可以整合。但是在项目实际部署的时候,需要把所有开源软件和项目程序的各种日志都整合到日志文件中输出,包括tomcat。
本文介绍使用log4j作为日志组件,commons-log, slf4j 作为整合器,同时使用slf4j桥接jdk14-logger输出到log4j日志器。总的来说,达到项目中所有使用这四中日志输出的都统一使用log4j输出。
1.日志需要的包依赖(maven dependency):
<properties> <slf4j.version>1.7.2</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <!-- LOGGING begin --> <!-- slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <!-- slf4j-log4j绑定 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- common-logging 实际调用slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- java.util.logging 实际调用slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!-- LOGGING end -->
2.log4j配置
log4j的配置较简单,使用通常的log4j.properties文件配置就可以,一般放到classes下就OK,你可以在web.xml中加入常量配置配置文件路径。该常量用于filter加载的时候加载日志配置。
<!--tomcat启动,filter载入的Log4j配置文件位置 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond, 用于在线动态修改log4j日志 --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>30000</param-value> </context-param>
一般情况下,使用Spring提供的org.springframework.web.util.Log4jConfigListener负载在tomcat启动的时候加载log4j配置托管spring的日志输出配置。
log4j.properties
log4j.rootCategory=INFO,stdout,logfile # Spring framework log level log4j.logger.org.springframework=INFO # spring modules log level #log4j.logger.org.springmodules=DEBUG # Hibernate log level # log4j.logger.org.hibernate=DEBUG log4j.logger.org.hibernate.SQL=DEBUG # Quartz log level #log4j.logger.org.quartz=INFO # Tomcat,commons... etc log level #log4j.logger.org.apache=INFO # Application log level #sql and execute time # log4jdbc log4j.logger.jdbc.sqltiming=INFO log4j.logger.jdbc.audit=OFF log4j.logger.jdbc.resultset=OFF log4j.logger.jdbc.sqlonly=INFO log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n #\u4e3b\u65e5\u5fd7\u6587\u4ef6 log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=logs/intergration.log log4j.appender.logfile.DatePattern=.yyyy-MM-dd log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 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:
public class CommonLogAndLog4j { private static final Log log = LogFactory.getLog(CommonLogAndLog4j.class); private static final Logger log4jLogger = Logger.getLogger(CommonLogAndLog4j.class); private static final java.util.logging.Logger jdkLogger = java.util.logging.Logger .getLogger(CommonLogAndLog4j.class.getName()); private static final org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(CommonLogAndLog4j.class); // -Djava.util.logging.config.file=D:/workshop/log-intergration/src/logging.properties public static void main(String[] args) { installJulToSlf4jBridge(); log.info("CommonsLog日志输出"); log4jLogger.info("Log4j日志输出"); jdkLogger.info("JDK14日志输出"); slf4jLogger.info("slft4j日志输出"); } public static void installJulToSlf4jBridge() { SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); } }
Webapp程序:
LoggerIntergrationListener.class
/** * 扩展Spring的Log4jConfigListener,在容器启动的时候,桥接JDK14的输出到slf4j-logger * * @author zhangpu */ public class LoggerIntergrationListener extends Log4jConfigListener { @Override public void contextInitialized(ServletContextEvent event) { installJulToSlf4jBridge(); event.getServletContext().log("Install Jdk-util-logger to slf4j success."); super.contextInitialized(event); } private void installJulToSlf4jBridge() { SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); } }
web.xml配置
<!--Intergration log4j/slf4j/commons-logger/jdk14-logger to log4j --> <listener> <listener-class>com.feinno.framework.common.web.support.LoggerIntergrationListener</listener-class> </listener>
OK,over!~
相关推荐
赠送jar包:log4j-to-slf4j-2.17.1.jar; 赠送原API文档:log4j-to-slf4j-2.17.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.17.1.pom; 包含翻译后...
赠送jar包:log4j-over-slf4j-1.7.33.jar; 赠送原API文档:log4j-over-slf4j-1.7.33-javadoc.jar; 赠送源代码:log4j-over-slf4j-1.7.33-sources.jar; 赠送Maven依赖信息文件:log4j-over-slf4j-1.7.33.pom; ...
赠送jar包:log4j-to-slf4j-2.17.1.jar; 赠送原API文档:log4j-to-slf4j-2.17.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.17.1.pom; 包含翻译后...
赠送jar包:log4j-over-slf4j-1.7.33.jar; 赠送原API文档:log4j-over-slf4j-1.7.33-javadoc.jar; 赠送源代码:log4j-over-slf4j-1.7.33-sources.jar; 赠送Maven依赖信息文件:log4j-over-slf4j-1.7.33.pom; ...
赠送jar包:log4j-to-slf4j-2.10.0.jar; 赠送原API文档:log4j-to-slf4j-2.10.0-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.10.0-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.10.0.pom; 包含翻译后...
slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...
赠送jar包:log4j-to-slf4j-2.12.1.jar; 赠送原API文档:log4j-to-slf4j-2.12.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.12.1.pom; 包含翻译后...
log4j-over-slf4j-1.7.25.jar
6. slf4j-log4j12.jar:SLF4J到Log4j的适配器,使得SLF4J的日志请求可以被Log4j处理。 总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,...
赠送jar包:log4j-to-slf4j-2.7.jar; 赠送原API文档:log4j-to-slf4j-2.7-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.7-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.7.pom; 包含翻译后的API文档:...
赠送jar包:log4j-to-slf4j-2.12.1.jar; 赠送原API文档:log4j-to-slf4j-2.12.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.12.1.pom; 包含翻译后...
赠送jar包:log4j-to-slf4j-2.10.0.jar; 赠送原API文档:log4j-to-slf4j-2.10.0-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.10.0-sources.jar; 包含翻译后的API文档:log4j-to-slf4j-2.10.0-javadoc-API文档-...
Log4j是Apache组织开发的一款强大的日志组件,它允许开发者对应用程序进行日志输出的控制。Log4j包括三个核心部分:配置器(Configurator)、日志记录器(Logger)和布局器(Layout)。配置器用于设置日志级别和输出...
log4j-slf4j-impl-2.0.2-javadoc.jar, log4j-slf4j-impl-2.0.2-sources.jar, log4j-slf4j-impl-2.0.2.jar, log4j-snmp-appender.jar, log4j-taglib-2.0.2-javadoc.jar, log4j-taglib-2.0.2-sources.jar, log4j-...
3. 灵活性强:Log4j2提供了多种日志输出方式,使得用户可以根据需要选择不同的日志输出方式。 搭建步骤: 要使用Slf4j集成Log4j2构建项目日志系统,需要按照以下步骤进行: 1. 删除项目中存在的Log4j1.x所必须的...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
今天,我们将讨论如何将 Log4j2 结合 Slf4j 配置使用,以便更好地记录和管理日志。 首先,我们需要下载 Log4j2 和 Slf4j 的 jar 文件。Log4j2 的下载地址是 http://logging.apache.org/log4j/2.x/download.html,...
赠送jar包:log4j-slf4j-impl-2.17.1.jar; 赠送原API文档:log4j-slf4j-impl-2.17.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.17.1.pom; ...
通常,Log4j的配置文件(例如log4j.properties或log4j.xml)会包含日志输出的级别(如DEBUG、INFO、WARN、ERROR等),输出目的地(如控制台、文件、网络等),以及日志格式。例如,你可以定义一个Appender来将日志...
在整合SLF4J与Log4j时,首先需要在项目中引入SLF4J的API库(slf4j-api-1.7.5.jar)和SLF4J对Log4j的绑定实现(slf4j-log4j12-1.7.5.jar)。同时,还需要Log4j自身的库(log4j-1.2.x.jar),以提供实际的日志记录服务...