关于log4j的使用

单独使用log4j

所需jar包:

    
    <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>1.2.17version>
    dependency>

代码实例:

    package com.xxx.common;
    import org.apache.log4j.Logger;

    /**
     * 单独使用log4j实例 
     * 缺点: 日志代码耦合性大
     * 
     * 
     * @author Administrator
     *
     */
    public class Log4jTest {

        private static Logger log = Logger.getLogger(Log4jTest.class);

        public static void main(String[] args) {
            Log4jTest log4jtest = new Log4jTest();
            log4jtest.log();
        }

        /**
         * 测试打印log
         */
        public void log(){
            /**
             * 为什么不是直接logger.debug(“debug:“+name);呢?
             * 在配置文件中虽然可以使用控制级别为比debug级别更高的级别,如 info, warn,error,fatal
             * 而不输出debug信息;但是,这里的字符串连接操作仍然会影响运行效率;
             * 如果先判断当前logger的级别,如果级别不合适的话,连这句字符串连接都可以不做了。
             */
            if (log.isDebugEnabled()){   
                log.debug("------DEBUG------");
            }
            log.info("------INFO------");
            log.warn("------WARN------");
            log.error("------ERROR------");
            log.fatal("------FATAL------");
        }
}

commons-logging 和log4j 结合使用

commons-logging 是apache提供的一个通用日志接口,用户可以自由选择第三方日志组件作为具体实现,像log4j等; commons-logging和log4j结合一起使用, 日志代码依赖于commons-logging而非log4j, 降低了日志代码的耦合性, 如果有需要更换日志实现类, 就会方便许多.

所需jar包:

    
    <dependency>
        <groupId>commons-logginggroupId>
        <artifactId>commons-loggingartifactId>
        <version>1.1version>
    dependency>
    
    <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>1.2.17version>
    dependency>

代码实例

    package com.xxx.common;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;


    public class CLTest {
        private static Log log = LogFactory.getLog(CLTest.class);

        public static void main(String[] args) {
            CLTest clTest = new CLTest();
            clTest.log();
        }

        public void log(){
            if (log.isDebugEnabled()) {
                  log.debug("Debug info.");
            }
            log.info("Info info");
            log.warn("Warn info");
            log.error("Error info");
            log.fatal("Fatal info");
         }
    }

slf4j和log4j结合使用

所需jar包:

    
    <dependency>
        <groupId>log4jgroupId>
        <artifactId>log4jartifactId>
        <version>1.2.17version>
    dependency>

    
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-apiartifactId>
        <version>1.7.12version>
    dependency>

    
    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-log4j12artifactId>
        <version>1.7.12version>
    dependency>

代码实例:

    package com.xxx.common;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    /**
     * 简单日记门面(simple logging Facade for java)
     * slf4j 和 log4j 结合使用, 接口: slf4j 实现类: log4j
     * 优点:
     *  1   SLF4J提供了占位日志记录,通过移除对isDebugEnabled(), 
     *    isInfoEnabled()等等的检查提高了代码的可读性。
     *  2   通过使用日志记录方法,直到你使用到的时候,才会去构造日志信息(字符串),
     *    这就同时提高了内存和CPU的使用率
     * @author Administrator
     *
     */
    public class SLTest {

        private static final Logger logger = LoggerFactory.getLogger(SLTest.class);

        public static void main(String[] args) {
            SLTest sLTest  = new SLTest();
            sLTest.log();
        }

        public void log(){
            /**
             * 大家应该还记得,在log4j中,为了提高运行效率,
             * 往往在输出信息之前,还要进行级别判断,
             * 以避免无效的字符串连接操作。如下:
             *  if (logger.isDebugEnabled()){
             *      logger.debug(“debug:“+name);
             *  }
             *  slf4j巧妙的解决了这个问题:先传入带有占位符的字符串,
             * 同时把其他参数传入,在slf4j的内容部实现中,
             * 如果级别合适再去用传入的参数去替换字符串中的占位符,否则不用执行。
             *  logger.info("{} is {}", new String[]{“x",“y"});
             */
             logger.debug("{}he{}",new Object[]{"object:","YY"});
             logger.info("{} info is {} and {}",new Object[]{"1","2","2"});
             //也可以不传object数组,传具体参数也行
             logger.error("error is {} and {}","1","2");;
        }
    }

log4j配置文件解析

    ### set log levels ###
    log4j.rootLogger = debug , stdout , D , E , R

    ### 1: 输出到控制台 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    ## 输出INFO级别以上的日志
    log4j.appender.stdout.Threshold = DEBUG
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n

    ### 2: 按日期生成debug以上级别到日志文件 ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    #文件路径对, 没有文件夹 , 是会自动建立文件夹的 
    log4j.appender.D.File = C:/Users/Administrator/Desktop/logs/log.log
    log4j.appender.D.Append = true
    ## 输出DEBUG级别以上的日志
    log4j.appender.D.Threshold = DEBUG
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

    ### 3: 按日期生成error级别以上信息到文件 ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    ## 异常日志文件名
    log4j.appender.E.File =C:/Users/Administrator/Desktop/logs/error.log 
    log4j.appender.E.Append = true
     ## 只输出ERROR级别以上的日志!!!
    log4j.appender.E.Threshold = ERROR
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

    ### 4: 按文件大小生成总量小于一定个数的日志文件 ###
    #按大小分割,循环覆盖
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.MaxFileSize=1MB
    log4j.appender.R.MaxBackupIndex=2
    log4j.appender.R.File=C:/Users/Administrator/Desktop/logs/partLog.log
    log4j.appender.R.Threshold=DEBUG
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d %p  %C.%M(%L) | %m%n

你可能感兴趣的:(log4j)