log4j使用

                           

  类图镇楼

 

                          

 

 

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

 

  图一:

  log4j使用手册介绍

 

  图二:

  

 

  输出格式:

    

 

 

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

posted @ 2016-10-13 16:59  孙猴子  阅读(1787)  评论(0编辑  收藏  举报