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

  • 相关阅读:
    将图片部署在tomcat/iportWork/uploadFiles中
    idea中的svn配置
    mavan和idea的搭建,很好的一篇文章
    C#如何遍历数组?
    java 泛型小小的测试题
    js关于变量作为if条件的真假问题
    HTML5实现两个视频循环播放!
    JQuery利用选择器定位动态id?
    hibernate QBC查询
    mybatis前台传来一个String,后后台执行sql变成了true
  • 原文地址:https://www.cnblogs.com/yinger/p/2174292.html
Copyright © 2020-2023  润新知