log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)
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>
- </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!~
log4j日志整合输出(slf4j+commonslog+log4j+jdklogger)的更多相关文章
- Log4J日志整合及配置详解
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...
- MongoDB log4j 日志整合
在分布式系统当中,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数据库系统中,而再由日志分析系统去管理.而这个储存日志 ...
- Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明
Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...
- 记一次log4j日志文件输出错误的解决
log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ]. 起因:部门网站使用B ...
- log4j日志文件输出保存
og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appe ...
- log4j日志不输出的问题
今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了.从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论. 先说一下 ...
- log4j日志不输出MyBatis SQL脚本?
日志输出级别调成debug,然并卵? 试试加下这个包. <dependency> <groupId>org.slf4j</groupId> <artifact ...
- Java日志框架SLF4J和log4j以及logback的联系和区别
1.SLF4J(Simple logging Facade for Java) 意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接 ...
- log4j日志输出到web项目指定文件夹
感谢 eric2500 的这篇文章:http://www.cxyclub.cn/n/27860/ 摘要:尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终在eric2500的指导 ...
随机推荐
- 使用tor网络
在www.torproject.org/projects/torbrowser.html.en上找到合适的版本下载 下载好tor浏览器之后,解压双击Tor Browser,出现这个错误 这是因为kal ...
- Pandas基本功能之层次化索引及层次化汇总
层次化索引 层次化也就是在一个轴上拥有多个索引级别 Series的层次化索引 data=Series(np.random.randn(10),index=[ ['a','a','a','b','b', ...
- 在 Android Studio 上调试数据库 ( SQLite ) (转)
转自:http://c.colabug.com/thread-1781696-1-1.html 以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我 ...
- Redis集群架构【转载】
Redis 集群的 TCP 端口(Redis Cluster TCP ports) 每个 Redis 集群节点需要两个 TCP 连接打开.正常的 TCP 端口用来服务客户端,例如 6379,加 100 ...
- empty 与 remove 的区别
empty()移除指定元素中的所有子节点,拿$("p").empty()来说,他只是把<p>dsfsd</p>中的文本给移除了,而留下 了<p> ...
- JS中DOM以及BOM
一.bom对象 1screen对象 console.log(screen.width);// 屏幕宽度 console.log(screen.height);// 屏幕高度 console.log(s ...
- mysql、oracle 中按照拼音首字母排序
mysql中按照拼音首字母排序 convert(name using gbk) ASC 注:name 为字段名称 oracle中按照拼音首字母排序 nlssort(enterprise_name,'N ...
- mysql的事务,隔离级别和锁
事务就是一组一起成功或一起失败的sql语句.事务还应该具备,原子性,一致性,隔离性和持久性. 一.事务的基本要素 (ACID) 1.原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处 ...
- IDEA使用过程中常见小问题
在磁盘随便一个位置,创建一个文件夹,可以通过IDEA open 打开它 然后在将一些代码模块,放入这个文件夹,IDEA刷新,能够自动显示出来 然后执行下面的文档操作 1.IDEA通过一个项目文件导 ...
- Window10系统的安装
关于系统的安装网上有许多的教程,本文的教程并没有什么特别的.只是将自己在安装过程中遇到的问题记录下来,方便以后观看. 1.下载系统镜像 首先从MSDN上下载windows10镜像.在操作系统Windo ...