Log4j入门

来源:互联网 发布:连邦软件app 编辑:程序博客网 时间:2024/04/28 19:17

一.System.out.println的局限性 
    
    1.不能在运行时打开或者关闭 
    
    2.不能选择包或者类,在运行的时候打开或者关闭 
    
    3.输出的信息没有分级 
    
    4.只能输出文本信息 
    
    5.不能改变输出的位置,只能输出在控制台上. 
        
    
二.log4j 基础

    1.官方网址: 
        http://logging.apache.org/log4j        
    
    2.log4j的两种配置文件由下面的两个类解析 
    
        解析log4j.properties :  PropertyConfigurator.configure( filePath ); 
        
        解析log4j.xml :  DOMConfigurator.configure( filePath );       

    3.如何得到logger 
    
        (1). Logger.getLogger( Test.class ); 
    
        (2). Logger.getLogger("sql");  --  得到配置文件中设置的sql logger 
        
三.例子

    1.一个简单的使用log4j的例子 
    
        import org.apache.log4j.*; 
        
        public class HelloLog4j{ 
            private static Logger logger = Logger.getLogger(HelloLog4j.class); 
            
            public static void main(String[] args){ 
                StringBuffer sb = new StringBuffer();  
                // 记录debug级别的信息 
                logger.debug(sb); 
                // 记录info级别的信息 
                logger.info(sb); 
                // 记录warn级别的信息 
                logger.warn(sb); 
                // 记录error级别的信息 
                logger.error(sb); 
                // 记录fatal级别的信息 
                logger.fatal(sb); 
            } 
        } 
        
        注: 运行这个例子时,需要log4j.properties 或 log4j.xml  --  放在src目录下.

    2.log4j.properties配置文件 
    
        log4j.rootLogger=DEBUG,CONSOLE 
        #rootLogger: 定义的是默认的logger,如果想自己定义到哪个包下的类的日志,可用log4j.logger.com.gdin... 
        #DEBUG: 定义的日志级别是DEBUG,小于DEBUG级别的日志则不会输出 
        #CONSOLE: 定义一个Appender, 该appender的具体信息如下

        # 应用于控制台 
        log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
        log4j.appender.CONSOLE.Threshold=INFO 
        log4j.appender.CONSOLE.Target=System.out 
        log4j.appender.CONSOLE.Encoding=GBK 
        #log4j.appender.CONSOLE.layout=org.apache.log4j.TTCCLayout 
        log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
        log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
        #layout: 定义一个输出样式,有些不用定义它的样式,如TTCCLayout; 有些则需要,如PatternLayout

 

四.log4j核心

    1.Logger  --  Logger完成日志信息的处理 
    
        注: Logger可以定义输出的层次和决定信息是否输出 
        
            Logger输出的信息有优先级别的: 
                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 
                
        注: 定义了哪一个层次,则小于该层次的日志不会输出.    
    
    2.Appender  --  Appender设置日志信息的去向 
    
        Appender就是设置日志信息输出到中地方,可以同是指定多个输出目的地. 
        
        常用的有以下几个: 
            org.apache.log4j.ConsoleAppender (控制台) 
            
            org.apache.log4j.FileAppender (文件) 
            
            org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件) 
            
            org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件) 
            
            org.apache.log4j.WriterAppender (将日志信息以串流格式发送到任意指定的地方) 
            
            org.apache.log4j.JdbcAppender (将日志信息保存到数据库中)    
    
    3.Layout  --  Layout设置日志信息的输出样式         
              
            org.apache.log4j.HTMLLayout (以HTML表格形式布局) 
            
            org.apache.log4j.SimpleLayout (包含日志信息的级别和讯息字符串) 
            
            org.apache.log4j..TTCCLayout (包含日志产生的时间,执行者,类别等信息) 
            
            org.apache.log4j.PatternLayout (可以灵活地指定布局模式) 
            
                样式: 
                
                    %p : 输出优先级, 即 DEBUB, INFO, WARN 等  priority 
                    
                    %r : 输出自应用启动到输出该日志信息所耗费的毫秒数  runtime 
                    
                    %t : 输出产生该日志事件的线程名  thread 
                    
                    %f : 输出日志信息所属的类别的类别名  
                    
                    %c : 输出日志信息所属的类的全名  classname 
                    
                    %d : 输出日志时间点的日期或时间,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss}  datetime 
                    
                    %l : 输出日志事件的发生位置,即输出日志信息的语句排在它所在的类的第几行   line 
                     
                    %m : 输出代码中指定的信息,如log(message)中的message   message 
                    
                    %n : 输出一个换行符号 (这个一般都要使用,使每个日志信息为一行)     newline 
      
    4.配置文件 
        log4j.properties 
        log4j.xml 
        
        (1)log4j.properties配置 
            log4j.rootLogger = DEBUG, appender1 
            log4j.appender.appender1 = org.apache.log4j.ConsoleAppender 
            log4j.appender.appender1.layout = org.apache.log4j.SimpleLayout 
            
        (2)RootLogger 
        log4j.rootLogger = [lever], appenderName1, appenderName2, ...            
        如果上面的设定将输出等级设为INFO,就表示INFO~FATAL等级的信息将会输出,DEBUG等级的信息就会被忽略 
                 
        (3)为某个包设定 日志配置            
            log4j.logger.com.gdin = info, appender1 
            log4j.logger.com.v512 = debug, appender1, appender2            
            
        (4)设置一个名称的logger 
            log4j.logger.myname = debug, appender3            
            
        (5)如果只定义了log4j.logger.com.gdin = info,即定义了它的级别,没有定义它的appender.那么它会使用rootLogger中定义的appender.                
                
        (6).log4j的命名机制 
            log4j中定义的命名机制是一棵树的形式,根就是rootLogger名称节点. 
            如:Logger.getLogger("com.gdin.uc.TestA"),它会先到配置文档中找名称是com.gdin.uc.TestA的, 
                即定义为log4j.logger.com.gdin.uc.TestA的.如果找不到,则找com.gdin.uc的.再找不到就找com.gdin的.再找不到就找com的.再找不到就找rootLogger. 
            
            即是说,这棵树就像是java中的包定义一样,所以可以为不再包下的java源文件定义不同的日志机制. 
        
五.关于性能影响 
    
    1. log4j对程序的运行的性能影响非常小 
    
    2. 还可以通过下面的方式,降低性能影响: 
        if(logger.isDebugEnabled()){ 
            logger.debug( "x=" + longTimeRunning() ); 
        } 
    
六.培训 或 视频 
    
    1.java软件工程师培训 
        http://www.jobedu.com.cn 
        
    2.免费视频下载 
        http://www.jobedu.com.cn/shipin/video.html 
        
        http://www.v512.com 
        
    3.论坛答疑 
        http://bbs.v512.com

******************************log4j.properties 完整版***********************************

一.log4j.properties 完整版 
    
    转载自: http://blog.csdn.net/alex197963/archive/2008/11/07/3244912.aspx 
    
        log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE 
        log4j.addivity.org.apache=true

        # 应用于控制台 
        log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
        log4j.appender.CONSOLE.Threshold=INFO 
        log4j.appender.CONSOLE.Target=System.out 
        log4j.appender.CONSOLE.Encoding=GBK 
        log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
        log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        # 用于数据库 
        log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
        log4j.appender.DATABASE.URL=jdbc:oracle:thin:@192.168.0.103:1521:ORCL 
        log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver 
        log4j.appender.DATABASE.user=Nation 
        log4j.appender.DATABASE.password=1 
        log4j.appender.CONSOLE.Threshold=WARN 
        log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) 
            VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m') 
        # INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
        # 写入数据库中的表LOG4J的Message字段中,内容%d(日期)%c: 日志信息所在地(类名)%p: 
            日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行 
        log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
        log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        # 每天新建日志 
        log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
        log4j.appender.A1.File=C:/log4j/log 
        log4j.appender.A1.Encoding=GBK 
        log4j.appender.A1.Threshold=DEBUG 
        log4j.appender.A1.DatePattern='.'yyyy-MM-dd 
        log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
        log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

        #应用于文件 
        log4j.appender.FILE=org.apache.log4j.FileAppender 
        log4j.appender.FILE.File=C:/log4j/file.log 
        log4j.appender.FILE.Append=false 
        log4j.appender.FILE.Encoding=GBK 
        log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
        log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        # 应用于文件回滚 
        log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
        log4j.appender.ROLLING_FILE.Threshold=ERROR 
        log4j.appender.ROLLING_FILE.File=rolling.log 
        log4j.appender.ROLLING_FILE.Append=true 
        log4j.appender.CONSOLE_FILE.Encoding=GBK 
        log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
        log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
        log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
        log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        #自定义Appender 
        log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender 
        log4j.appender.im.host = mail.cybercorlin.net 
        log4j.appender.im.username = username 
        log4j.appender.im.password = password 
        log4j.appender.im.recipient = yyflyons@163.com 
        log4j.appender.im.layout=org.apache.log4j.PatternLayout 
        log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

        #应用于socket 
        log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
        log4j.appender.SOCKET.RemoteHost=localhost 
        log4j.appender.SOCKET.Port=5001 
        log4j.appender.SOCKET.LocationInfo=true 
        # Set up for Log Facter 5 
        log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
        log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t 
            [THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n 
        # Log Factor 5 Appender 
        log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
        log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

        # 发送日志给邮件 
        log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
        log4j.appender.MAIL.Threshold=FATAL 
        log4j.appender.MAIL.BufferSize=10 
        log4j.appender.MAIL.From=yyflyons@163.com 
        log4j.appender.MAIL.SMTPHost=www.wusetu.com 
        log4j.appender.MAIL.Subject=Log4J Message 
        log4j.appender.MAIL.To=yyflyons@126.com 
        log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
        log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

 

******************************log4j.xml配置**********************************

一.log4j.xml

    转载自: http://jan87215.javaeye.com/blog/630518 
    
        <?xml version="1.0" encoding="GBK"?> 
        <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
        <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
            <!--输出方式是:每天一个日志文件-->  
            <!--设置通道名称是:file,输出方式DailyRollingFileAppender--> 
            <appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender"> 

                <!--日志文件路径和文件名称 -->  
                <!--加../在logs,加/在C盘,不加在bin目录 --> 
                <!--如果在加载时设置了变量System.setProperty("WebApp", appRoot),可在此取出来${WebApp} --> 
                <param name="File" value="../logs/mylog.log"/>  
                
                <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->  
                <param name="Append" value="true"/>  
              
                <!-- Rollover at midnight each day -->  
                <!-- e.g. mylog.log.2009-11-25.log --> 
                <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/> 

                <!-- Rollover at the top of each hour   
                <param name="DatePattern" value="'.'yyyy-MM-dd-HH'.log'"/>  
                --> 

                <layout class="org.apache.log4j.PatternLayout">  
                    <!-- The default pattern: Date Priority [Category] Message\n -->  
                    <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> 
              
                    <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n --> 
                    <!-- <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> -->  
                </layout>       
            </appender> 
          
            <appender name="ERROR_LOG" class="org.apache.log4j.DailyRollingFileAppender">  
                <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>  
                <param name="File" value="error.log"/>  
                <param name="Append" value="true"/>  
                <!-- 指定日志输出级别 --> 
                <param name="Threshold" value="INFO"/>  
                <param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/>  
                <layout class="org.apache.log4j.PatternLayout">  
                <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>  
                </layout>  
            </appender> 
            
            <!-- level:是日记记录的优先级,优先级由高到低分为    
                 OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。   
                 Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这四个级别。--> 

            <!-- 指定logger的设置,additivity指示是否叠加输出log,如果是false, 
                在DsErrorLog logger中日志不会被其它logger满足条件的logger(比如root)输出 -->   
                
            <!-- 将名称为DSErrorLog的logger,输出到“EEROR_LOG”的appender   
                 所谓logger的名字也就是,在定义Logger时,构造函数的参数   
                  Logger log = Logger.getLogger("DSErrorLog");  -->  
            <logger name="DSErrorLog" additivity="false">  
                <level class="org.apache.log4j.Level" value="DEBUG"/>  
                <appender-ref ref="ERROR_LOG"/>  
            </logger>  
                   
            <!--输出指定类包中的日志,比如想输出   
                Hibernate运行中生成的SQL语句,可作如下设置 -->  
            <category name="org.hibernate.SQL">  
                <priority value="DEBUG"/>  
                <!-- 如果指定一个appender,这些log将被输出到指定的appender   
                    如:<appender-ref ref="myFile"/>否则将作用于所有的appender -->  
           </category>  
                       
            <!--根默认会自动构建一个 root,输出INFO级别的日志到控制台,供logger继承 -->       
            <root>       
                <priority value ="DEBUG"/>       
                <appender-ref ref="myConsole"/>       
                <appender-ref ref="myFile"/>          
            </root>          
        </log4j:configuration> 


****************************************一个比较有用的log4j应用 ***************************************8

一.log4j.xml配置实现

    转载自: http://flying3615.blog.163.com/blog/static/2830344720098119265985/

    1.先写一个Servlet的listener,用来监听服务启动,并自动解析log4j.xml文件

        代码如下:

            import javax.servlet.ServletContextEvent; 
            import javax.servlet.ServletContextListener;

            import org.apache.log4j.LogManager; 
            import org.apache.log4j.PropertyConfigurator; 
            import org.apache.log4j.xml.DOMConfigurator;

            public class Log4jConfigListener implements ServletContextListener{ 
             
                public static final String CONFIG_LOCATION_PARAM = "log4jConfigLocation"; 
                public static final String XML_FILE_EXTENSION = ".xml";

                public void contextDestroyed(ServletContextEvent event) { 
                    LogManager.shutdown(); 
                }

                public void contextInitialized(ServletContextEvent event) { 
                    String location = event.getServletContext().getInitParameter(CONFIG_LOCATION_PARAM); 
                    if (location != null) { 
                        if (!location.startsWith("/")) { 
                            location = "/" + location; 
                        } 
                        location = event.getServletContext().getRealPath(location);

                        //如果是xml结尾就用DOM解析,否则就用properties解析 
                        if (location.toLowerCase().endsWith(XML_FILE_EXTENSION)) { 
                            DOMConfigurator.configure(location); 
                        }else { 
                            PropertyConfigurator.configure(location); 
                        } 
                    } 
                } 
            }


        2.再写个util类,用来生成所要的不同类型的日志

            代码如下:

                package com.zhaopin.util;

                import org.apache.log4j.Logger;

                public class Log4jUtil { 
                 
                 public static Logger getSQLLogger(){ 
                  return Logger.getLogger("sql"); 
                 } 
                 
                 public static Logger getBusinessLogger(){ 
                  return Logger.getLogger("business"); 
                 } 
                 
                 public static Logger getSimpleErrorLogger(){ 
                  return Logger.getLogger("simpleError"); 
                 } 
                 
                 public static Logger getNormalErrorLogger(){ 
                  return Logger.getLogger("normalError"); 
                 }

                }

  
        3.下面开始写配置文件,先要在web.xml下添加信息:

            <context-param> 
                <param-name>log4jConfigLocation</param-name> 
                <param-value>/WEB-INF/Log4j.xml</param-value> 
            </context-param> 
             
            <!-- 加载log4j配置文件 --> 
            <listener> 
                <listener-class>Log4jConfigListener</listener-class> 
            </listener>

 

        4.最重要的log4j.xml的配置信息如下:

            <?xml version="1.0" encoding="GBK"?> 
            <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
            <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
             
                <!-- 控制台输出 --> 
                <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> 
                    <param name="target" value="System.out"/> 
                    <layout class="org.apache.log4j.PatternLayout"> 
                        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> 
                    </layout> 
                </appender>

                <!-- SQL类日志 --> 
                <appender name="sql" class="org.apache.log4j.DailyRollingFileAppender"> 
                    <param name="File" value="/usr/local/tomcat/logs/testlog4j.sql.log"/> 
                    <param name="Append" value="true"/> 
                    
                    <!-- name="DatePattern", 配置这条信息是让日志每天自动生成,名字尾部追加日期格式, 
                        第一天生成的日志需第二天才能看到log可以通过更改系统时间来看日志的输出 
                    --> 
                    <param   name="DatePattern"   value="'.'yyyy-MM-dd"/> 
                    <layout class="org.apache.log4j.PatternLayout"> 
                        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> 
                    </layout> 
                </appender> 
                 
                <!-- 业务类日志 --> 
                <appender name="business" class="org.apache.log4j.DailyRollingFileAppender"> 
                    <param name="File" value="/usr/local/tomcat/logs/testlog4j.business.log"/> 
                    <param name="Append" value="true"/> 
                    <param   name="DatePattern"   value="'.'yyyy-MM-dd"/> 
                    <layout class="org.apache.log4j.PatternLayout"> 
                        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> 
                    </layout> 
                </appender> 
                 
                <!-- 不带执行轨迹错误日志 --> 
                <appender name="simpleError" class="org.apache.log4j.DailyRollingFileAppender"> 
                    <param name="File" value="/usr/local/tomcat/logs/testlog4j.error.simple.log"/> 
                    <param name="Append" value="true"/> 
                    <param   name="DatePattern"   value="'.'yyyy-MM-dd"/> 
                    <layout class="org.apache.log4j.PatternLayout"> 
                        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> 
                    </layout> 
                </appender> 
                 
                <!-- 带执行轨迹错误日志 --> 
                <appender name="normalError" class="org.apache.log4j.DailyRollingFileAppender"> 
                    <param name="File" value="/usr/local/tomcat/logs/testlog4j.error.normal.log"/> 
                    <param name="Append" value="true"/> 
                    <param   name="DatePattern"   value="'.'yyyy-MM-dd"/> 
                    <layout class="org.apache.log4j.PatternLayout"> 
                        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c] (%C:%L) - %m%n"/> 
                    </layout> 
                </appender> 
                     
                <!-- 下面定义logger --> 
                <logger name="sql" additivity="true"> 
                    <priority value="info"/> 
                    <appender-ref ref="sql"/> 
                </logger> 
                
                <logger name="business" additivity="true"> 
                    <priority value="info"/> 
                    <appender-ref ref="simpleError"/> 
                </logger> 
                
                <logger name="simpleError" additivity="true"> 
                    <priority value="info"/> 
                    <appender-ref ref="simpleError"/> 
                </logger> 
                
                <logger name="normalError" additivity="true"> 
                    <priority value="info"/> 
                    <appender-ref ref="normalError"/> 
                </logger> 
                
                <root>    
                    <appender-ref ref="STDOUT"/>   
                    <priority value="info"/> 
                </root>  
            </log4j:configuration>


        5.在程序中应用时需要编写如下代码:

            Log4jUtil.getBusinessLogger().info("message!");


0 0
原创粉丝点击