`
dxm1986
  • 浏览: 429427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Commons-logging和log4j学习笔记

 
阅读更多

 

一、 apache commons-logging与log4j和JDK logger的关系:
 > commons-logging的目的是为”所有的Java日志实现“提供统一的接口,而log4j和JDK Logger可以看做是其实现
 > 由于log4j功能非常强大、效率高,所以经常将commons-logging和log4j结合使用
 > commons-logging通过检测系统属性和类路径来选择合适的日志框架
 > commons-logging查找日志框架,顺序如下:
     >> 查看系统属性"org.apache.commons.logging.Log"是否被设置,若设置,使用该配置的日志框架
   eg. #

Java代码   收藏代码
  1. System.setProperty("org.apache.commons.logging.Log""org.apache.commons.logging.Log.impl.Log4JLogger");  

    >> 检测classpath是否存在log4j,若存在,则使用Log4JLogger实例
     >> 检测classpath是否存在JDK1.4日志框架,若存在则使用JDK14Logger
     >> 以上都不成立,则使用默认的SimpleLog

 

二、使用Log4J:
 > 使用Commons-logging和log4j结合的方法:(注意:将log4j.xml文件放在classpath下)

Java代码   收藏代码
  1. package org.rsljdkt.research.log4j;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. public class TestLog {  
  7.     private static Log log = LogFactory.getLog(TestLog.class);  
  8.     public static void main(String[] args){  
  9.         TestLog testLog = new TestLog();  
  10.         testLog.test();  
  11.     }  
  12.     public void test(){  
  13.         log.debug("debug_msg");  
  14.         log.warn("warn_msg");  
  15.         log.info("info_msg");  
  16.         log.error("error_msg");  
  17.         log.fatal("fatal_msg");  
  18.     }  
  19. }  

 > 单独使用Log4J:(也将log4j.xml文件放在classpath下)

Java代码   收藏代码
  1. package org.rsljdkt.research.log4j;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.apache.log4j.xml.DOMConfigurator;  
  5.   
  6. public class TestLog4J {  
  7.   
  8.     static Logger logger = Logger.getLogger(TestLog4J.class);  
  9.     public static void main(String[] args) {  
  10.         DOMConfigurator.configure("src\\log4j.xml");  
  11.         logger.debug("debug_msg");  
  12.         logger.warn("warn_msg");  
  13.         logger.info("info_msg");  
  14.         logger.error("error_msg");  
  15.         logger.fatal("fatal_msg");  
  16.     }  
  17.   
  18. }  

 

   log4j.xml内容为:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3.   
  4. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">  
  5.   
  6.    <appender name="terminal" class="org.apache.log4j.ConsoleAppender">  
  7.       <param name="Target" value="System.out"/>  
  8.       <layout class="org.apache.log4j.PatternLayout">  
  9.          <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>  
  10.       </layout>  
  11.    </appender>  
  12.    <root>  
  13.       <level value="ALL"/>  
  14.       <appender-ref ref="terminal"/>  
  15.    </root>  
  16. </log4j:configuration>  

 

三、Log4J关键概念:
> 记录器(Logger):
       >> 获取记录器:
       # Logger logger = Logger.getLogger(JavaLoggingExample.class.getName()); 
       >> 记录器的层次结构:
   在每个类中,使用Log4J的Logger.getLogger()方法都会创建一个Logger实例,为了方便Logger的配置,
   Log4J采用了一种树状的集成层次解决此问题
   static Logger root = Logger.getRootLogger();
   static Logger log1 = Logger.getLogger("org");
   static Logger log2 = Logger.getLogger("org.rsljdkt");
   
   以上,root是树根,log1是root的孩子,log2是log1的孩子,因此常在log4j的配置文件中配置rootLog即可。
> 级别(Level):
  日志级别,用于控制日志的是否输出。Log4J中规定了5种日志级别:
   DEBUG < INFO < WARN < ERROR < FATAL
 
> 布局(Layout):
  指定了日志信息的格式化输出方式,使用类似C语言的printf方式。
  
 > 输出源(Appenders):
     >> 指定记录器按照指定的布局将日志信息写于一个或者多个输出源。
  >> 输出源可以是控制台、文本文件、XML文件、Socket、数据库等,甚至可以将日志信息通过邮件发送
  >> 输出源需要相应的类来处理,eg. ConsoleAppender, FileAppender, SocketAppender, NtEventLogAppender, JMSAppender。

四、Log4J的配置:

> 属性(Property)文件方式
      >> 配置根Logger,格式为:
         log4j.rootLogger = [ level ], appenderName1, appenderName2, ...
         其中level为日志优先级,分别为OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL或者你定义的级别。
         Log4J建议只使用四个级别,从高到底依次是:ERROR, WARN, INFO, DEBUG。
      >> 配置日志信息输出目的地Appender,格式为:

.properties代码   收藏代码
  1. log4j.appender.appenderName = fully.qualified.name.of.appender.class  
  2. log4j.appender.appenderName.option1 = value1  
  3. ...  
  4. log4j.appender.appenderName.optionN = valueN  

      其中,Log4J提供的appender有以下几种:
   org.apahce.log4j.ConsoleAppender(控制台)
   org.apache.log4j.FileAppender(文件)
   org.apahce.log4j.DailyRollingFileAppender(每天产生一个日志文件)
   org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
   org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的方式)
  >> 配置日志信息的格式(Layout),格式为:

Properties代码   收藏代码
  1.  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
  2. log4j.appender.appenderName.layout.option1 = value1  
  3. ...  
  4. log4j.appender.appenderName.layout.optionN = valueN  

    其中,Log4J提供的layout有以下几种:
    org.apahce.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活的指定布局)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
   Log4J采用类似C语言的printf函数控制打印日志信息的格式化,打印参数如下:
       >> %m 输出代码中指出的消息
       >> %p 输出优先级,即DEBUG, INFO, WARN, ERROR, FATAL
       >> %r 输出子应用启动到输出log信息所耗费的毫秒数
       >> %c 输出所属的类目,通常就是所在类的全名
       >> %t 输出产生该日志事件的线程名
       >> %n 输出一个换行回车符,Windows平台对应”\r\n“,Unix平台对应”\n“
       >> %d 输出日志时间点的日期或者时间,默认为ISO8601格式,也可以在其后指定格式,eg.
          %d{yyyy MM dd HH:mm:ss,SSS},输出的格式类似:2010 12 21 22:22:28 987
       >> %l 输出日志事件的发生位置,包括类目、发生的进程以及代码中的行数
 eg.
  ## 使用两个输出源,一个是控制台,一个是文件

.properties代码   收藏代码
  1. log4j.rootLogger=debug, stdout, R   
  2.   # 设置特定包的级别和输出源  
  3.   log4j.logger.your.package.name=WARN, stdout  
  4.   ## 第一个输出源  
  5.   log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  6.   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  7.   # 输出调用者的文件名和行号  
  8.   log4j.appender.stdout.layout.ConversionPattern=%5p[%t](%F:%L)-%m%n  
  9.   ## 第二个输出源  
  10.   log4j.appender.R=org.apache.log4j.RoolingFileAppender  
  11.   log4j.appender.R.File=example.log  
  12.   # 日志文件的最大大小  
  13.   log4j.appender.R.MaxFileSize=100KB  
  14.   # 归档日志文件数,即两个日志文件,轮流转  
  15.   log4j.appender.R.MaxBackupIndex=1  
  16.   log4j.appender.R.layout=org.apache.log4j.PatternLayout  
  17.   log4j.appender.R.layout.ConversionPattern=%p %t %c-%m%n  

   另外参见:http://rsljdkt.iteye.com/blog/848805
> XML文件方式:
  参见:http://rsljdkt.iteye.com/blog/848786
五、Log4J在Web中的应用: 
> Log4J必须在应用的其他代码执行前进行初始化。
> 在Web应用职工,一般专门配置一个Servlet来完成Log4J的配置,并保证在web.xml中,这个Servlet位于其他Servlet之前
  eg.
  java code:

Java代码   收藏代码
  1. package org.rsljdkt.research.log4j;  
  2. import java.io.*;  
  3. import javax.servlet.*;  
  4. import org.apache.log4j.*;  
  5. public class Log4JInit extends HttpServlet{  
  6.     public void init()throws ServletException{  
  7.         String prefix = getServletContext().getRealPath("/");  
  8.         String file = getServletConext().getInitParameter("log4j-config-file");  
  9.         if(file != null){//从Servlet参数中读取log4j配置文件  
  10.             PropertyConfigurator.configure(prefix+file);  
  11.         }  
  12.     }  
  13.     public void doGet(HttpServletRequest request, HttpServletResponse respons)  
  14.         throws IOException, ServletException{  
  15.     }  
  16.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  17.         thows IOExcepion, ServletException{  
  18.     }  
  19. }  

 

web.xml(部分):

 

Xml代码   收藏代码
  1. <servlet>  
  2.                 <servlet-name>log4jinit</servlet-name>  
  3.                 <servlet-class>org.javaresearch.log4j.Log4JInit</servlet-class>  
  4.                 <init-param>  
  5.                     <param-name>log4j-config-file</param-name>  
  6.                     <param-value>/properties/log4j.properties</param-value>  
  7.                 </init-param>  
  8.                 <load-on-startup>1</load-on-startup>  
  9.             </servlet>  

 

六、高级话题:

> 性能:
    >> Log4J的首要设计目的就是高效
    >> 根据Log4J小组的报告,在AMD Duron 800MHz + JDK1.3.1环境下,Log4J判断一条语句是否需要输出仅需5ns。
      实际的日志执行语句非常快速,共使用SimpleLayout的21ms(几乎和System.out.println一样快)到TTCCLayout的37ms不等
 > 嵌套诊断环境NDC
    >> Log4J采用NDC机制来解决多线程记录日志的情况下区分日志信息是由那个线程输出的问题
    >> Log4J为同一类别的线程生成一个Logger,多个线程共享使用
    >> Log4J的实现如下:
    1. 在进入一个环境时,调用NDC.push(String ),然后创建一个NDC
    2. 所做的日志操作输出包含NDC的信息
    3. 离开该环境时,调用NDC.pop()方法
    4. 当从一个进程退出时,调用NDC.remove()方法,以释放资源
   
七、补充:Log4J的使用步骤:
 > 1. 得到记录器:

Java代码   收藏代码
  1. public staitc Logger getLogger(String name);  
  2.  public static Logger getLogger(Class clazz);   

 > 2. 读取配置文件:

Java代码   收藏代码
  1. BasicConfigurator.configure();//快速使用Log4J缺省的环境  
  2.   PropertyConfigurator.configure(String configFileName);//读取Java属性文件编写的配置文件  
  3.   DOMConfigurator.configure(String fileName);//读取XML格式的配置文件  

> 3. 插入记录信息(格式化日志信息):

Java代码   收藏代码
  1. Logger.debug(Object message);  
  2.   Logger.info(Object message);  
  3.   Logger.warn(Object message);  
  4.   Logger.error(Object message);  

分享到:
评论

相关推荐

    为什么同时使用commons-logging和Log4j

    为什么同时使用commons-logging和Log4j?commons-logging为我们提供了统一的日志接口,可以用各种日志工具类。log4j是目前输出日志的首选。

    commons-logging.jar

    commons-logging-1.0-javadoc.jar, commons-logging-1.0.1-javadoc.jar, commons-logging-1.0.1.jar, commons-logging-1.0.2-javadoc.jar, commons-logging-1.0.2.jar, commons-logging-1.0.3-javadoc.jar, commons-...

    Commons-logging + Log4j 使用

    这是一个讲解commons-logging 和log4j的使用方法,里面有一些例子供大家参考。

    apache-log4j-2.3-bin和commons-logging-1.2

    官网下载,未作任何改动

    spring-framework & commons-logging

    spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & ...

    commons-logging-1.2-API文档-中英对照版.zip

    赠送jar包:commons-logging-1.2.jar; 赠送原API文档:commons-logging-1.2-javadoc.jar; 赠送源代码:commons-logging-1.2-sources.jar; 包含翻译后的API文档:commons-logging-1.2-javadoc-API文档-中文...

    commons-logging-1.1.3.jar

    common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的...使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。

    (zt)Commons-logging + Log4j 入门指南

    NULL 博文链接:https://tianjun309.iteye.com/blog/776137

    commons-logging和Log4j的关系

    NULL 博文链接:https://icourses.iteye.com/blog/1839984

    commons-logging-1.2-API文档-中文版.zip

    赠送jar包:commons-logging-1.2.jar; 赠送原API文档:commons-logging-1.2-javadoc.jar; 赠送源代码:commons-logging-1.2-sources.jar; 包含翻译后的API文档:commons-logging-1.2-javadoc-API文档-中文...

    commons-logging-1.1.3-API文档-中英对照版 (2).zip

    赠送jar包:commons-logging-1.1.3.jar; 赠送原API文档:commons-logging-1.1.3-javadoc.jar; 赠送源代码:commons-logging-1.1.3-sources.jar; 赠送Maven依赖信息文件:commons-logging-1.1.3.pom; 包含翻译后...

    commons-logging-1.1.1

    Commons-loggin的目的是为“所有的Java日志实现”提供一个统一的接口,它自身的日志功能平常弱(只有一个简单的SimpleLog?...另外一个我能想到的“同时使用commons-logging和Log4j”的原因是,简化使用和配置

    commons-logging-1.1.3-API文档-中文版.zip

    赠送jar包:commons-logging-1.1.3.jar; 赠送原API文档:commons-logging-1.1.3-javadoc.jar; 赠送源代码:commons-logging-1.1.3-sources.jar; 赠送Maven依赖信息文件:commons-logging-1.1.3.pom; 包含翻译后...

    log4j-1.2.14和commons-logging-1.1

    log4j 用的两个jar包,log4j-1.2.14.jar 和 commons-logging-1.1.jar

    commons-logging-1.2-sources.jar

    commons-logging-1.2-sources.jar资源

    commons-logging-1.1.1-API文档-中文版.zip

    赠送jar包:commons-logging-1.1.1.jar 赠送原API文档:commons-logging-1.1.1-javadoc.jar 赠送源代码:commons-logging-1.1.1-sources.jar 包含翻译后的API文档:commons-logging-1.1.1-javadoc-API文档-中文...

    log4j.jar\commons-logging-1.1.1.jar

    log4j日志包 log4j.jar\commons-logging-1.1.1.jar private static final Log log = LogFactory.getLog(xxxxxx.class); 下载后解压就能得到这两个包

    log4j.jar和commons-logging.jar

    配置日志文件时需要的jar包,配置日志文件时需要的jar包,配置日志文件时需要的jar包

    开发工具 commons-logging-1.2

    开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发工具 commons-logging-1.2开发...

    commons-logging-1.2-bin.zip下载

    这是commons-logging-1.2-bin.zip,有需要的朋友下载使用

Global site tag (gtag.js) - Google Analytics