Java之Log4j入门 [V512工作室视频]

一.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!");

原文地址:https://www.cnblogs.com/yinger/p/2174292.html