• 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

  • 相关阅读:
    Docker-CentOS系统安装Docker
    Docker-准备Docker环境
    Docker系列-文章汇总
    商品订单库存一致性问题的思考
    java模板、工厂设计模式在项目中的重构
    2018Java年底总结
    java的AQS中enp没有同步代码块为啥是原子操作
    java使用awt包在生产环境docker部署时出现中文乱码的处理
    初探装饰器模式
    开灯问题
  • 原文地址:https://www.cnblogs.com/springlight/p/5957122.html
Copyright © 2020-2023  润新知