类图镇楼
1.先谈部署
别怕,这可不是部署Tomcat。把log4j的包和commons-logging的包(加在一起才两个)放到classpath下面。然后把配置文件保存为log4j.properties,也放在classpath下面(如果用Eclipse的话,放在src目录下即可)。然后你就可以跑了。
2.再谈配置
虽然可以用xml或者在运行时用Java来配置Log4j,但还是properties文件好用啊!
样例:
#日志级别DEBUG,目的地consoleAppender1,这是根日志组件,经测试,mybatis的SQL输出收这个影响 log4j.rootLogger=DEBUG,consoleAppender1,debugfile #--------------配置 输出对象的目的 格式 ----------------- #目的地consoleAppender1输出到控制台 log4j.appender.consoleAppender1=org.apache.log4j.ConsoleAppender #目的地consoleAppender1输出格式 log4j.appender.consoleAppender1.layout=org.apache.log4j.PatternLayout log4j.appender.consoleAppender1.layout.ConversionPattern=%5p %d %C: %m%n #debug 输出错误日志文件 log4j.appender.errorfile=org.apache.log4j.RollingFileAppender log4j.appender.errorfile.File=${catalina.home}/logs/outside-error.log //${catalina.home} : tomcat服务器文件夹目录 log4j.appender.errorfile.MaxFileSize=10240KB # Keep three backup files. log4j.appender.errorfile.MaxBackupIndex=3 # Pattern to output: date priority [category] - message log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout log4j.appender.errorfile.layout.ConversionPattern=%d %p - %m%n log4j.additivity.errorfile = false #debug 输出其他日志文件 log4j.appender.debugfile=org.apache.log4j.RollingFileAppender log4j.appender.debugfile.File=${catalina.home}/logs/outside-debug.log log4j.appender.debugfile.MaxFileSize=10240KB # Keep three backup files. log4j.appender.debugfile.MaxBackupIndex=10 # Pattern to output: date priority [category] - message log4j.appender.debugfile.layout=org.apache.log4j.PatternLayout log4j.appender.debugfile.layout.ConversionPattern=%d %p - %m%n log4j.additivity.debugfile = false #--------------配置 具体内容输出到 输出对象------------------------------ #日志级别DEBUG,目的地consoleAppender2,和debugfile log4j.logger.service=DEBUG,debugfile #spring统一异常处理,日志级别ERROE,目的地consoleAppender2,和errorfile log4j.logger.util.web.CustomSimpleMappingExceptionResolver=info,errorfile #spring统一异常处理,日志级别ERROE,目的地consoleAppender2,和errorfile log4j.logger.util.web.ExceptionAdvisor=info,errorfile #mongodb,日志级别DEBUG,目的地consoleAppender1,和debugfile log4j.logger.common.mongodb.service.FileOptService=DEBUG,consoleAppender1,debugfile #指定SQL 输出 #log4j.logger.java.sql.ResultSet=INFO,consoleAppender1 log4j.logger.org.apache=ERROR,errorfile #log4j.logger.java.sql.Connection=DEBUG,debugfile #log4j.logger.java.sql.Statement=DEBUG,consoleAppender2 #log4j.logger.java.sql.PreparedStatement=DEBUG,debugfile #输出sql到文件 #处理Spring,mybatis错误级别日志的写到异常文件 log4j.logger.org.springframework=ERROR,errorfile log4j.logger.org.mybatis=ERROR,errorfile #cxf log4j.logger.org.apache.cxf=info,consoleAppender1,debugfile #不附加,作用就是 避免重复打印 log4j.additivity.controller=false log4j.additivity.service=false log4j.additivity.dao=false log4j.additivity.org.apache.cxf=false log4j.additivity.common.mongodb.service.FileOptService=false
配置分析:
1>. 最最重要的两个概念:Logger(继承层次)和Appender(输出控制);(请参考Log4J手册)
2>. rootLogger 总是存在于log4j中,即使没有显示配置也是存在的,并且默认输出级别为DEBUG;
3>. ConsoleAppender 输出到控制台;RollingFileAppender 输出到指定路径下的文件中;两者为log4j中的类,都实现了Appender类;
4>. File,MaxBackupIndex(保留文件数量),layout,MaxFileSize 皆为设置的属性;
5>. additivity 限制appender的叠加性,使同一输出不至于多次输出;
6>. logger 为 rootLogger 的子集,可以自定义子集的输出级别。
7>.输出级别越低,输出的数量更多;级别更高,就不会输出低级别的日志;
日志级别:
TRACE->DEBUG-> INFO-> WARN->ERROR->FATAL
图一:
图二:
输出格式:
3.谈下思想
思想:Log4j真的很简单,简单到令人发指的地步。不是要记录日志吗?那就给你一个Log,然后你用Log来写东西就行了;
Log.class中输出级别对应的方法
样例
package test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Test { static Log log = LogFactory.getLog(Test.class);//这里的“Test.class”事实上传进去的是Test这个类的完整路径(包名+类名),“test.Test” 这样如果存在“test”这个Log那么Test这个Log就继承它,否则就继承rootLogger public void log(){ log.debug("Debug info."); log.info("Info info"); log.warn("Warn info"); log.error("Error info"); log.fatal("Fatal info"); } /** * @param args */ public static void main(String[] args) { Test test = new Test(); test.log(); } }
4.默认的log4j初始化过程
Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。
* 如果程序员已经通过设置系统属性的方法来配置了log4j环境,则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。
Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下:
1>. 检查系统属性log4j.defaultInitOverride,如果该属性被设置为false,则执行初始化;否则(只要不是false,无论是什么值,甚至没有值,都是否则),跳过初始化。
2>. 把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义,则把resource赋值为"log4j.properties"。注意:在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。
3>. 试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通,就调用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法来完成转化。
4>. 如果url以".xml"结尾,则调用方法DOMConfigurator.configure(url)来完成初始化;否则,则调用方法PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得,则跳出初始化过程。
5.Logger 两点说明
1>. 用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。
2>. logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。
参考资料:
1>. http://www.cnblogs.com/Fskjb/archive/2011/01/29/1947592.html
2>. https://logging.apache.org/log4j/2.x/manual/architecture.html
3>. http://www.cnblogs.com/suman/archive/2010/10/23/1858864.html