zoukankan      html  css  js  c++  java
  • 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 日志的使用例子:

    [java] view plaincopy
     
    1. /**    
    2.  * @author oscar999    
    3.  * @date 2013-8-1 
    4.  * @version V1.0    
    5.  */  
    6. package com.oscar999.log;  
    7.   
    8. import java.io.IOException;  
    9. import java.util.Date;  
    10. import java.util.logging.FileHandler;  
    11. import java.util.logging.Formatter;  
    12. import java.util.logging.Level;  
    13. import java.util.logging.LogRecord;  
    14. import java.util.logging.Logger;  
    15.   
    16.   
    17. public class TestLogJava {  
    18.   
    19.     public static void main(String[] args) throws IOException{  
    20.         Logger log = Logger.getLogger("tesglog");  
    21.         log.setLevel(Level.ALL);  
    22.         FileHandler fileHandler = new FileHandler("testlog.log");  
    23.         fileHandler.setLevel(Level.ALL);  
    24.         fileHandler.setFormatter(new LogFormatter());  
    25.         log.addHandler(fileHandler);  
    26.         log.info("This is test java util log");     
    27.     }  
    28.   
    29. }  
    30.   
    31. class LogFormatter extends Formatter {  
    32.     @Override  
    33.     public String format(LogRecord record) {  
    34.         Date date = new Date();  
    35.         String sDate = date.toString();  
    36.         return "[" + sDate + "]" + "[" + record.getLevel() + "]"  
    37.                 + record.getClass() + record.getMessage() + " ";  
    38.     }  
    39.   
    40. }  

    这里是在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, 并放入项目的根路径下.(也可以放入其他路径,在读的时候需要指定)

    看一下一个配置实例:

    [html] view plaincopy
     
    1. log4j.rootLogger=debug,stdout,logfile  
    2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    4. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n  
    5.   
    6. log4j.appender.logfile=org.apache.log4j.RollingFileAppender  
    7. log4j.appender.logfile.File=logfile.log  
    8. log4j.appender.logfile.MaxFileSize=512KB  
    9. log4j.appender.logfile.MaxBackupIndex=3  
    10. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
    11. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  

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

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

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

    3. 测试java 文件

    [java] view plaincopy
     
    1. /**    
    2.  * @author oscar999    
    3.  * @date 2013-8-1 
    4.  * @version V1.0    
    5.  */  
    6. package com.oscar999.log;  
    7.   
    8. import org.apache.log4j.Logger;  
    9. import org.apache.log4j.PropertyConfigurator;  
    10.   
    11. public class TestLog4j {  
    12.   
    13.     public static void main(String[] args) {  
    14.         // 1. create log  
    15.         Logger log = Logger.getLogger(TestLog4j.class);  
    16.         // 2. get log config file  
    17.         PropertyConfigurator.configure("log4j.properties");  
    18.         // 3. start log  
    19.         log.debug("Here is some DEBUG");  
    20.         log.info("Here is some INFO");  
    21.         log.warn("Here is some WARN");  
    22.         log.error("Here is some ERROR");  
    23.         log.fatal("Here is some FATAL");  
    24.     }  
    25.   
    26. }  


    配置稍显麻烦,但是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  的配置

    [html] view plaincopy
     
    1. org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger  

    一句话,指定使用log4j

    3. 测试代码:

    [java] view plaincopy
     
    1. /**    
    2. * @author oscar999    
    3. * @date 2013-8-1 
    4. * @version V1.0    
    5. */  
    6. package com.oscar999.log;  
    7.   
    8. import org.apache.commons.logging.Log;  
    9. import org.apache.commons.logging.LogFactory;  
    10.   
    11. public class TestLogCom {  
    12.   
    13.     static Log log = LogFactory.getLog(TestLog.class);  
    14.     public static void main(String[] args) {  
    15.   
    16.         log.debug("Here is some DEBUG");  
    17.         log.info("Here is some INFO");  
    18.         log.warn("Here is some WARN");  
    19.         log.error("Here is some ERROR");  
    20.         log.fatal("Here is some FATAL");  
    21.     }  
    22.   
    23. }  


    除了使用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的方式记录日志。这也是目前用的比较多的记录日志的方式。

  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/IvyCodingLife/p/4225873.html
Copyright © 2011-2022 走看看