• java 日志技术汇总(log4j , Commons-logging,.....)


    前言

    在java 中实现记录日志的方式有很多种,

    1. 最简单的方式,就是system.print.out ,err 这样直接在控制台打印消息了。

    2. java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中写日志了。

    3. log4j , 最强大的记录日志的方式。 可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。

    4. commons-logging, 最综合和常见的日志记录方式, 经常是和log4j 结合起来使用。

    java.util.logging --JDK 记录日志方式

    system.print 这就不用多说了,

    直接看一下java api 中 logging 日志的使用例子:

    /**   
     * @author oscar999   
     * @date 2013-8-1
     * @version V1.0   
     */
    package com.oscar999.log;
    
    import java.io.IOException;
    import java.util.Date;
    import java.util.logging.FileHandler;
    import java.util.logging.Formatter;
    import java.util.logging.Level;
    import java.util.logging.LogRecord;
    import java.util.logging.Logger;
    
    
    public class TestLogJava {
    
    	public static void main(String[] args) throws IOException{
    		Logger log = Logger.getLogger("tesglog");
    		log.setLevel(Level.ALL);
    		FileHandler fileHandler = new FileHandler("testlog.log");
    		fileHandler.setLevel(Level.ALL);
    		fileHandler.setFormatter(new LogFormatter());
    		log.addHandler(fileHandler);
    		log.info("This is test java util log");   
    	}
    
    }
    
    class LogFormatter extends Formatter {
    	@Override
    	public String format(LogRecord record) {
    		Date date = new Date();
    		String sDate = date.toString();
    		return "[" + sDate + "]" + "[" + record.getLevel() + "]"
    				+ record.getClass() + record.getMessage() + "
    ";
    	}
    
    }

    这里是在eclipse 下code 和测试的。

    首先定义一个Logeer的实例,并设置log 的级别,接着添加一个fileHander ,就是把日志写到文件中。在写入文件的时候,定义一个 LogFormatter对日志进行格式的渲染。

    默认状况下, 日志会打印到控制台。添加filehandler 后, 会同时写入文件。 如不指定路径,日志文件将位于项目根路径下。

    log4j 记录日志方式

    log4j 是apache 提供的记录日志的jar 档。

    下载路径:

    http://logging.apache.org/log4j/1.2/download.html

    这里要做的事情稍微要多一些:

    1. 下载log4j 的jar 包,放入项目的lib 包中(添加到项目的build path中)。

    2.  配置log4j.properties, 并放入项目的根路径下.(也可以放入其他路径,在读的时候需要指定)

    看一下一个配置实例:

    log4j.rootLogger=debug,stdout,logfile
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender
    log4j.appender.logfile.File=logfile.log
    log4j.appender.logfile.MaxFileSize=512KB
    log4j.appender.logfile.MaxBackupIndex=3
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

    这里指定了日志输出的级别 debug.

    stdout, logfile 指定日志输出的目的地。 这两个名字可以随便取,比如 A, 或B都可以。 实际的配置是  org.apache.log4j.ConsoleAppender 和RollingFileAppender  用于指定是控制台还是文件。

    另外还指定了输出的格式, 已经产生的file 的规则。

    3. 测试java 文件

    /**   
     * @author oscar999   
     * @date 2013-8-1
     * @version V1.0   
     */
    package com.oscar999.log;
    
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    public class TestLog4j {
    
    	public static void main(String[] args) {
    		// 1. create log
    		Logger log = Logger.getLogger(TestLog4j.class);
    		// 2. get log config file
    		PropertyConfigurator.configure("log4j.properties");
    		// 3. start log
    		log.debug("Here is some DEBUG");
    		log.info("Here is some INFO");
    		log.warn("Here is some WARN");
    		log.error("Here is some ERROR");
    		log.fatal("Here is some FATAL");
    	}
    
    }
    


    配置稍显麻烦,但是code 时就简单多了。

    commons-logging写日志方式

    Commons-logging 也是Apache 提供的日志jar 档。

    下载地址:

    http://commons.apache.org/proper/commons-logging/download_logging.cgi

    你有可能要问为什么有了log4j还有提供Commons-logging呢? 这两者有什么区别吗?

    其实从Commons-logging这个名字就可以看出来, 这应该是一个日志的共用接口。实际上, 它的确是这样一个作用,

    使用Commons-logging的LogFactory获取日志处理类时:

    1) 首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
    2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
    如果在Tomact中可以建立一个叫 :CATALINA_OPTS 的环境变量
    给 他的 值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn
    3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
    4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
    5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;

    先使用第一种方式来看一个实例,配置commons-logging.properties, 使用log4j来记录日志。

    注意, commons-logging 要配合log4j 记录日志,必须把log4j的jar 包也导入到项目中。

    1. 导入log4j 和commons-logging的jar 包

    2. 配置commons-logging.properties 和 log4j.properties, 放入项目的classpath下(也就是src目录下)

    注意: 单独使用log4j 的时候,log4j.properties 默认是放在项目的根目录下。

    log4j.properties 的内容和上面完全相同。

    看一下commons-logging.properties  的配置

    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

    一句话,指定使用log4j

    3. 测试代码:

    /**   
    * @author oscar999   
    * @date 2013-8-1
    * @version V1.0   
    */
    package com.oscar999.log;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    public class TestLogCom {
    
    	static Log log = LogFactory.getLog(TestLog.class);
    	public static void main(String[] args) {
    
    		log.debug("Here is some DEBUG");
    		log.info("Here is some INFO");
    		log.warn("Here is some WARN");
    		log.error("Here is some ERROR");
    		log.fatal("Here is some FATAL");
    	}
    
    }
    


    除了使用log4j 之外, 还可以配置

    -org.apache.commons.logging.impl. Jdk14Logger 使用JDK1.4。
    -org.apache.commons.logging.impl. Log4JLogger 使用Log4J。
    -org.apache.commons.logging.impl. LogKitLogger 使用 avalon-Logkit。
    -org.apache.commons.logging.impl. SimpleLog common-logging自带日志实现类。它实现了Log接口,把日志消息都输出到系统错误流System.err 中。 
    -org.apache.commons.logging.impl. NoOpLog common-logging自带日志实现类。它实现了Log接口。 其输出日志的方法中不进行任何操作。

    总结

    以上有一条

    3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;

    项目同时导入log4j 和commons-logging的jar 包, 不需要配置commons-logging.properties ,只需要在classpath中配置 log4j.properties就可以使用log4j的方式记录日志。这也是目前用的比较多的记录日志的方式。

  • 相关阅读:
    JAVA(五)反射机制/Annotation
    JAVA(四)类集/枚举
    JAVA(三)JAVA常用类库/JAVA IO
    JAVA(二)异常/包及访问权限/多线程/泛型
    JAVA(一)JAVA基础/面向对象基础/高级面向对象
    【Android】Android输入子系统
    【Linux】深入理解Linux中内存管理
    【XMPP】基于XMPP的即时通讯解决方案
    cf593d
    cf593c
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3231133.html
Copyright © 2020-2023  润新知