zoukankan      html  css  js  c++  java
  • 项目log4j日志管理详解

    项目log4j日志管理详解

    log4j日志系统在项目中重要性在这里就不再累述,我们在平时使用时如果没有特定要求,只需在log4j.properties文件中顶入输出级别就行了。如果要自定义输出文件,对于初次使用者可能会遇到一点的小麻烦。最近在项目中刚做了一个统计用户登录的日志文件,要求将用户登录到某个模块的信息输出到login.log中,每天生成一个已日期命名的该类文件,现share出来。

    1.Log4j下载 

    在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。 

    2.Log4j使用 

    Log4j的包下载完成后,解压,将其中打包好的的log4j-1.x.x.jar导入你的工程LIB中。 
    Log4j之所以受欢迎的原因之一是它的灵活性。Log4j提供了灵活的配置方法,默认是调用BasicConfigurator.configure()来进行配置,但如果只是简单的调用BasicConfigurator.configure()来进行配置工作,那么所有的配置都是固定的,不方便以后修改配置。另一种是动态配置,Log4j提供了PropertyConfigurator.configure(……)来动态配置,参数可以是一个properties文件所在路径的String对象,可以是一个properties文件所在路径的URL对象,也可以是一个properties对象。如果要用XML文件来配置信息,则可用类型的DOMConfigurator()函数来从一个XML文件中加载配置信息。这种方式更方便修改配置。

    ************************************************

    1. public class Log4jHelloworld {       
    2.     static Logger log = Logger.getLogger(Log4jDemo.class.getClass());       
    3.     /**     
    4.      * main     
    5.      * @param args     
    6.      */      
    7.     public static void main(String[] args) {       
    8.         BasicConfigurator.configure();//默认配置       
    9.         PropertyConfigurator.configure("c:/log4j.properties");       
    10.         //动态配置,参数可以是一个properties文件所在路径的String对象       
    11.         //可以是一个properties文件所在路径的URL对象,也可以是一个properties对象       
    12.                
    13.         DOMConfigurator.configure("c:/log4j.xml");//XML配置文件       
    14.       
    15.         //PropertyConfigurator.configure()的参数还可以是XML、Properties对象       
    16.                
    17.         //下面就可使用log4j       
    18.         log.info("info");       
    19.         log.debug("debug");       
    20.         log.error("error");       
    21.         log.warn("warn");       
    22.     }       
    23.       

    *************************************************************

         

    J2EE应用使用Log4j,必须先在启动服务时加载Log4j的配置文件进行初始化,可以在web.xml中进行

    *************************************************************

    1. public class J2eeLog4jDemo extends HttpServlet {       
    2.       
    3.     public void destroy() {       
    4.         super.destroy();        
    5.     }          
    6.     public void doGet(HttpServletRequest request, HttpServletResponse response)       
    7.             throws ServletException, IOException {       
    8.     }       
    9.     public void doPost(HttpServletRequest request, HttpServletResponse response)       
    10.             throws ServletException, IOException {             
    11.     }       
    12.     public void init() throws ServletException {       
    13.         //通过web.xml来动态取得配置文件       
    14.         String prefix = getServletContext().getRealPath("/");       
    15.         String file = getInitParameter("log4j");       
    16.       
    17.         //如果没有给出相应的配置文件,则不进行初始化       
    18.         if(file != null)        
    19.         {       
    20.             PropertyConfigurator.configure(prefix+file);       
    21.         }       
    22.     }       
    23.       
    24. }

    Web.xml 代码

    1. <servlet>      
    2. <servlet-name>j2eelog4jdemoservlet-name>      
    3. <servlet-class>J2eeLog4jDemoservlet-class>      
    4. <init-param>      
    5. <param-name>log4jparam-name>      
    6. <param-value>log4j.propertiesparam-value>      
    7. init-param>      
    8. <load-on-startup>1load-on-startup>  //设为1时,Web容器启动即进行加载    
    9. </servlet>  

       

    *************************************************************

       

    Spring配置Log4j 

    Spring中配置Log4j只要配置applicationContext.xml文件,Log4j的配置文件放在Web工程的根目录下,默认是objectname/root下,可以在web.xml中设置工程根目录

    *************************************************************


    设置根目录 


    web.xml 代码

    Java代码 复制代码
    1. <!--不定义webAppRootKey参数,webAppRootKey就是缺省的"webapp.root"-->      
    2.  <context-param>      
    3.   <param-name>webAppRootKeyparam-name>      
    4.   <param-value>webapp.rootparam-value>      
    5.  context-param>  
    [java] view plaincopy
     
    1. <!--不定义webAppRootKey参数,webAppRootKey就是缺省的"webapp.root"-->     
    2.  <context-param>     
    3.   <param-name>webAppRootKeyparam-name>     
    4.   <param-value>webapp.rootparam-value>     
    5.  context-param>  



    配置applicationContext.xml 


    applicationContext.xml 代码

    1. <!--由Sprng载入的Log4j配置文件位置-->      
    2. <context-param>      
    3.  <param-name>log4jConfigLocation</param-name>      
    4.  <param-value>/WEB-INF/log4j.properties</param-value>      
    5.  <!--在这里定位配置文件,需要的是从root开始的绝对路径-->      
    6. context-param>      
    7.       
    8.       
    9.       
    10. <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->      
    11. <context-param>      
    12.  <param-name>log4jRefreshIntervalparam-name>      
    13.  <param-value>60000param-value>      
    14. context-param>      
    15.       
    16. <!--Spring log4j 监听器-->      
    17. <listener>      
    18.  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>      
    19. listener>     
    [java] view plaincopy
     
    1. <!--由Sprng载入的Log4j配置文件位置-->     
    2. <context-param>     
    3.  <param-name>log4jConfigLocation</param-name>     
    4.  <param-value>/WEB-INF/log4j.properties</param-value>     
    5.  <!--在这里定位配置文件,需要的是从root开始的绝对路径-->     
    6. </context-param>     
    7.      
    8.      
    9.      
    10. <!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->     
    11. <context-param>     
    12.  <param-name>log4jRefreshInterval</param-name>     
    13.  <param-value>60000</param-value>     
    14. </context-param>     
    15.      
    16. <!--Spring log4j 监听器-->     
    17. <listener>     
    18.  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>     
    19. </listener>     



    同时使用commons-logging和Log4j 


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


    将commons-logging和Log4j的jar包都放置到classpath下,同时也将Log4j的配置文件放到classpath中,两者就可以很好的合作,实现如下:

    1. package com.doctorcom.model;       
    2.       
    3. import org.apache.commons.logging.Log;       
    4.       
    5. public class LogFactorySupport {           
    6.           
    7.     public Log getLog(){       
    8.         Log log = org.apache.commons.logging.LogFactory.getLog(LogFactorySupport.class);       
    9.         log.info("");       
    10.         log.debug("");       
    11.     }       
    12.            
    13. }   

    Log4j配置内容 

    看一个简单的java属性配置文件log4j.properties: 

    properties 代码
    1. #指定根Logger,及日志输出级别,大于等于该级别的日志将被输出( DEBUG < INFO < WARN < ERROR < FATAL ) 设为OFF可以关闭日志       
    2. log4j.rootLogger=DEBUG, A1,A2       
    3. #指定log输出目的,这里设为输出日志到指定目录的文件my.log中       
    4. log4j.appender.A1=org.apache.log4j.FileAppender       
    5. log4j.appender.A1.File=//logs//my.log   #当前根目录下    
    6. #指定日志信息的格式       
    7. log4j.appender.A1.layout=org.apache.log4j.PatternLayout        
    8. log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n       
    9.       
    10. #把A2输出到控制台       
    11. log4j.appender.A2=org.apache.log4j.ConsoleAppender       
    12. log4j.appender.A2.layout=org.apache.log4j.SimpleLayout        
    13.       
    14. #还可以单独指定输出某个包的日志级别       
    15. #log4j.logger.com.study.HelloLog4j=INFO   
    [java] view plaincopy
     
    1. #指定根Logger,及日志输出级别,大于等于该级别的日志将被输出( DEBUG < INFO < WARN < ERROR < FATAL ) 设为OFF可以关闭日志      
    2. log4j.rootLogger=DEBUG, A1,A2      
    3. #指定log输出目的,这里设为输出日志到指定目录的文件my.log中      
    4. log4j.appender.A1=org.apache.log4j.FileAppender      
    5. log4j.appender.A1.File=//logs//my.log   #当前根目录下   
    6. #指定日志信息的格式      
    7. log4j.appender.A1.layout=org.apache.log4j.PatternLayout       
    8. log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n      
    9.      
    10. #把A2输出到控制台      
    11. log4j.appender.A2=org.apache.log4j.ConsoleAppender      
    12. log4j.appender.A2.layout=org.apache.log4j.SimpleLayout       
    13.      
    14. #还可以单独指定输出某个包的日志级别      
    15. #log4j.logger.com.study.HelloLog4j=INFO   



    1、配置根Logger,其语法为: 

    log4j.rootLogger = [ level ] , appenderName, appenderName2 
    level:日志的级别,指定这条日志信息的重要性。分为ALL < DEBUG < INFO < WARN <error fatal=""></error>一般常用的为 DEBUG , INFO ,WARN ,ERROR四种,分别对应Logger类的四种方法 
    debug(Object message ) ; 
    info(Object message ) ; 
    warn(Object message ) ; 
    error(Object message ) ; 
    如果设置级别为INFO,则优先级大于等于INFO级别(如:INFO、WARN、ERROR)的日志信息将可以被输出,小于该级别的如:DEBUG将不会被输出 
    appenderName :就是指定日志信息输出目的地,比如(打印到控制台,输出到文件等)。同一条日志信息可以配置多个输出目的地。 

    2、配置log输出目的地 

    Log4j提供以下几种: 
    org.apache.log4j.ConsoleAppender(控制台) 
    org.apache.log4j.FileAppender(文件) 
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 

    3、log信息的格式 

    org.apache.log4j.HTMLLayout(HTML表格形式) 
    org.apache.log4j.SimpleLayout(简单格式的日志,只包括日志信息的级别和指定的信息字符串 ,如:DEBUG - Hello) 
    org.apache.log4j.TTCCLayout(日志的格式包括日志产生的时间、线程、类别等等信息) 
    org.apache.log4j.PatternLayout(灵活地自定义日志格式) 

    当使用org.apache.log4j.PatternLayout来自定义信息格式时,可以使用 
    log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p -%m%n 来格式化信息 
    %c    输出所属类的全名,可写为 %c{Num} ,Num类名输出的范围  如:"com.sun.aaa.classB", %C{2}将使日志输出输出范围为:aaa.classB 
    %d    输出日志时间其格式为 可指定格式 如 %d{HH:mm:ss}等 
    %l    输出日志事件发生位置,包括类目名、发生线程,在代码中的行数 
    %n    换行符 
    %m    输出代码指定信息,如info(“message”),输出message 
    %p    输出日志的优先级,即 FATAL ,ERROR 等 
    %r    输出从启动到显示该条日志信息所耗费的时间(毫秒数) 
    %t    输出产生该日志事件的线程名

    *************************************************************

    项目中代码(login.log实现)

    log4j.properties

    #logger
    log4j.rootLogger=INFO,Sout,Opr,Err
    log4j.logger.app=Sout
    log4j.logger.sys=Sout
    #Console
    log4j.appender.Sout=org.apache.log4j.ConsoleAppender
    log4j.appender.Sout.layout=org.apache.log4j.PatternLayout
    log4j.appender.Sout.layout.ConversionPattern= [%d{HH:mm:ss,SSS}] [%p] [%c] - %m%n

    #Exception log
    log4j.appender.Err=org.apache.log4j.RollingFileAppender
    #log4j.appender.Err.File= D:/member_error.log
    log4j.appender.Err.File= IEWLog/IEW_error.log
    log4j.appender.Err.Threshold = ERROR  
    log4j.appender.Err.MaxFileSize=100KB
    log4j.appender.Err.MaxBackupIndex=1
    log4j.appender.Err.layout=org.apache.log4j.PatternLayout
    log4j.appender.Err.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    #Operation log
    log4j.appender.Opr = org.apache.log4j.DailyRollingFileAppender
    #log4j.appender.Opr.File = D:/member_operation.log
    log4j.appender.Opr.File = IEWLog/IEW_operation.log
    log4j.appender.Opr.Append = true
    log4j.appender.Opr.layout = org.apache.log4j.PatternLayout
    log4j.appender.Opr.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    #自定义Login log appender
    log4j.appender.Login = org.apache.log4j.DailyRollingFileAppender
    #log4j.appender.Opr.File = D:/member_operation.log
    log4j.appender.Login.File = IEWLog/IEW_login.log
    log4j.appender.Login.Append = true
    log4j.appender.Login.layout = org.apache.log4j.PatternLayout
    log4j.appender.Login.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

    ################################### Noted by chenzhiwu #

    #The following properties is for lib-specified log information, 
    #for more information, refer to the log4j API and docs.
    #you can change the Priority by yourself,but please don't check in.

    #log4j.logger.com.hisoft.zmd=debug
    #log4j.logger.com.opensymphony.xwork.interceptor=debug

    #log4j.logger.org.springframework=debug

    #为了减小服务器空间压力将hibernate、webwork和spring框架的日志级别都定为了error
    log4j.logger.org.springframework=error
    log4j.logger.org.hibernate=error
    log4j.logger.org.hibernate.hql.ast.AST=error

    log4j.logger.org.hibernate.SQL=error

    log4j.logger.org.hibernate.type=error
    log4j.logger.org.hibernate.tool.hbm2ddl=error

    log4j.logger.org.hibernate.hql=error

    ### log cache activity ###
    log4j.logger.org.hibernate.cache=error
    log4j.logger.org.hibernate.loader=error

    #自定义login的日志级别和指定日志生成appender

    #log4j.logger.+包名和类名
    log4j.logger.com.chn.uma.security.web.action.TurnToAction=INFO,Login
    log4j.logger.com.chn.uma.security.web.action.LoginAction=INFO,Login

    LoginAction.java

    /**
     * <p>
     * 验证登录信息.
     * </p>
     * 
     * @author sc
     */
    public class LoginAction extends ModelDrivenBaseAction {

       //使用默认的appender或其他

       private Logger log = Logger.getLogger("");

    /**
     * 使用自定义的Login appender<br/>
     *   Logger.getLogger()参数this.getClass映射到属性文件中的<br/>

     *   log4j.logger.com.chn.uma.security.web.action.LoginAction=INFO,Login<br/>
     *

     */

       private Logger login = Logger.getLogger(this.getClass());

    ........


    }

    生成IEW_login.log.2010-10-11和IEW_login.log.txt

    IEW_login.log.txt中日志为:

    2010-10-13 09:57:05  [ http-8080-1:187658 ] - [ INFO ]  [admin] Login in [OM] module
    2010-10-13 10:00:34  [ http-8080-9:396993 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 10:14:10  [ http-8080-5:285736 ] - [ INFO ]  [admin] Login in [OM] module
    2010-10-13 10:14:24  [ http-8080-3:299181 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 10:30:33  [ http-8080-2:779416 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 13:43:14  [ http-8080-3:12340532 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 14:05:40  [ http-8080-2:305465 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 14:27:49  [ http-8080-1:139601 ] - [ INFO ]  [admin] Login in [IEW] module
    2010-10-13 16:00:58  [ http-8080-3:128085 ] - [ INFO ]  [admin] Login in [IEW] module

    转自:http://blog.csdn.net/shengchuang/article/details/5939481

  • 相关阅读:
    export default 和 export 的使用方式(六)
    webpack结合vue使用(五)
    webpack 中导入 vue 和普通网页使用 vue 的区别(四)
    普通组件定义渲染和render渲染组件的区别(三)
    代码规范
    vue切换路由时,取消所有axios请求
    JS设计模式-策略模式
    CSS世界(张鑫旭)系列学习总结 (五)内联元素与流
    Vue中Jsx的使用
    Vue事件总线(EventBus)
  • 原文地址:https://www.cnblogs.com/apache-x/p/5337501.html
Copyright © 2011-2022 走看看