log4j日志总结

一、log4j简介
          日志组件,依托Log4j.jar工具包, 主要用于记录日志信息,规定日志要输出的地方和日志以何种形式进行输出。
二、日志输出级别
debug级别 <  可以通过配置文件规定输出消息的级别。
三、log4j的组成、配置及使用
        1)主要由3个重要的组件组成部分:Logger组件、Appender组件、Layout组件
          a、 Logger组件:日志器,里面提供了一些方法,用于往外输出日志
                log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true。
          b、Appender组件:用于指定信息输出方式,例如控制台输出、文件输出、流输出等
               (1)asyncAppender:异步记日志
               (1)fileAppender:文件
                    选项:
                        1) Threshold=WARN   指定日志消息的输出最低层次。 
                        2) ImmediateFlush=true   默认值是true,意谓着所有的消息都会被立即输出。 
                        3) File=mylog.txt   指定消息输出到mylog.txt文件。 
                        4) Append=false   默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
                    例如:     
                         log4j.rootLogger = debug,stdout,D,E
                         log4j.appender.D = org.apache.log4j.FileAppender
log4j.appender.D.File = E://logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ]
               (2)consoleAppender:控制台记录日志
                    选项:
                        (1) Threshold=WARN    指定日志消息的输出最低层次。 
                        (2) ImmediateFlush=true   默认值是true,意谓着所有的消息都会被立即输出。 
                        (3)Target=System.out   默认情况下是:System.out,指定输出控制台 
                    例如:
                        log4j.rootLogger = debug,stdout         
                        log4j.appender.stdout = org.apache.log4j.ConsoleAppender
                        log4j.appender.stdout.Target = System.out
                        log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
                        log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} meth
                (3)DailyRollingFileAppender:每天产生一个日志文件
                    选项:
                        (1)Threshold=WARN   指定日志消息的输出最低层次。 
                        (2)ImmediateFlush=true   默认值是true,意谓着所有的消息都会被立即输出。 
                        (3)File=mylog.txt   指定消息输出到mylog.txt文件。 
                        (4)Append=false   默认值是true,即以追加的方式将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 
                        (5)DatePattern=''.''yyyy-ww   每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分 
                            1)''.''yyyy-MM: 每月 
                            2)''.''yyyy-ww: 每周  
                            3)''.''yyyy-MM-dd: 每天 
                            4)''.''yyyy-MM-dd-a: 每天两次 
                            5)''.''yyyy-MM-dd-HH: 每小时 
                            6)''.''yyyy-MM-dd-HH-mm: 每分钟 
                      例如:
                            log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
                            log4j.appender.file.DatePattern='.'yyyy-MM-dd
                            log4j.appender.file.File=D:\\run.log
                            当前月的日志文件名为run.log,前一个月的日志文件名为run.log.yyyy-MM-dd

                 (4)RollingFileAppender:文件大小到达指定尺寸的时候产生一个新的文件

                        选项:

                            (1)Threshold=WARN   指定日志消息的输出最低层次。 
                            (2)ImmediateFlush=true   默认值是true,意谓着所有的消息都会被立即输出。 
                            (3)File=mylog.txt   指定消息输出到mylog.txt文件。 
                            (4)Append=false   默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 
                            (5)MaxFileSize=100KB   后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动 。
                            (6)MaxBackupIndex=2   指定可以产生的滚动文件的最大数。

                        例如:

                             log4j.appender.R.MaxFileSize=10MB
                             log4j.appender.R.MaxBackupIndex=10

                             一个日志文件最大10M,到了10M后自动创建一个新的文件,但最多创建10个,超过10个后自动删除最旧的那个。 

                 (5)WriterAppender:将日志信息以流格式发送到任意指定的地方

                            log4j.rootCategory= DEBUG,WriterAppender
                            log4j.appender.WriterAppender=org.apache.log4j.WriterAppender
                            log4j.appender.WriterAppender.Threshold=debug
                            log4j.appender.WriterAppender.layout=org.apache.log4j.PatternLayout
                            log4j.appender.WriterAppender.layout.ConversionPattern=%d{ISO8601} - %p - %m%n

          c、Layout组件:用于指定信息输出格式
               (1)HTMLLayout:以HTML表格形式布局
                    选项:
                         LocationInfo=true:默认值是false,输出java文件名称和行号 
                         Title=my app file: 默认值是 Log4J Log Messages. 
               (2) PatternLayout:可以灵活地指定布局模式
                    选项:
                         ConversionPattern=%m%n :指定怎样格式化指定的消息
               (3)SimpleLayout:包含日志信息的级别和信息字符串
               (4)TTCCLayout:包含日志产生的时间、线程、类别等等信息
               (5)XMLLayout:   以XML格式进行输出
                    选项:LocationInfo=true:默认值是false,输出java文件名称和行号 
                           
              三个组件之间的关系:一个logger可以有多个Appender。然后每个Appender只有一个layout     
      2) 配置日志信息的格式
            #src/log4j.properties
                log4j.rootLogger = DEBUG,console,file
            #appender
                log4j.appender.console = org.apache.log4j.ConsoleAppender
                log4j.appender.file = org.apache.log4j.FileAppender
                log4j.appender.file.File = D\:\\log4j.html
            #layout
                log4j.appender.console.layout = org.apache.log4j.SimpleLayout
                log4j.appender.file.layout =org.apache.log4j.HTMLLayout
          第一个参数定义消息级别,将大于等于这个消息级别的信息进行输出
          第二个参数定义输出方式,只是一个标识符,通过这个标识符来指定输出方式
          第三个组件指定信息输出格式
            
       
      附:比较全面的配置
        Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。
        log4j.rootLogger=DEBUG,console,dailyFile,im
        log4j.additivity.org.apache=true
      # 控制台(console)
        log4j.appender.console=org.apache.log4j.ConsoleAppender
        log4j.appender.console.Threshold=DEBUG
        log4j.appender.console.ImmediateFlush=true
        log4j.appender.console.Target=System.err
        log4j.appender.console.layout=org.apache.log4j.PatternLayout
        log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

      # 日志文件(logFile)
        log4j.appender.logFile=org.apache.log4j.FileAppender
        log4j.appender.logFile.Threshold=DEBUG
        log4j.appender.logFile.ImmediateFlush=true
        log4j.appender.logFile.Append=true
        log4j.appender.logFile.File=D:/logs/log.log4j
        log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

      # 回滚文件(rollingFile)
        log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
        log4j.appender.rollingFile.Threshold=DEBUG
        log4j.appender.rollingFile.ImmediateFlush=true
        log4j.appender.rollingFile.Append=true
        log4j.appender.rollingFile.File=D:/logs/log.log4j
        log4j.appender.rollingFile.MaxFileSize=200KB
        log4j.appender.rollingFile.MaxBackupIndex=50
        log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

      # 定期回滚日志文件(dailyFile)
        log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
        log4j.appender.dailyFile.Threshold=DEBUG
        log4j.appender.dailyFile.ImmediateFlush=true
        log4j.appender.dailyFile.Append=true
        log4j.appender.dailyFile.File=D:/logs/log.log4j
        log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
        log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %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 Factor 5
        log4j.appender.socket.layout=org.apache.log4j.PatternLayout
        log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %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 = xxx@mail.com
        log4j.appender.mail.SMTPHost=mail.com
        log4j.appender.mail.Subject=Log4J Message
        log4j.appender.mail.To= xxx@mail.com
        log4j.appender.mail.layout=org.apache.log4j.PatternLayout
        log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

      # 应用于数据库
        log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
        log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
        log4j.appender.database.driver=com.mysql.jdbc.Driver
        log4j.appender.database.user=root
        log4j.appender.database.password=
        log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
        log4j.appender.database.layout=org.apache.log4j.PatternLayout
        log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %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 = corlin@cybercorlin.net
        log4j.appender.im.layout=org.apache.log4j.PatternLayout
        log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
   
   3)log4j的使用  
      a、引入log4j.jar包
      b、在src下增加log4j.properties配置文件并进行配置
      c、程序调用
      具体实现举例如下:    
          1、如何将某个功能作为一个独立的日志文件进行输出:

              如果想对不同的类输出不同的文件(以cn.com.Test为例)

              (1)在Test.java中定义:

                  private static Log logger = LogFactory.getLog(Test.class);

          (2)配置log4j.properties文件

                  log4j.logger.cn.com.Test= DEBUG, test

                  log4j.appender.test=org.apache.log4j.FileAppender

                  log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log

                  log4j.appender.test.layout=org.apache.log4j.PatternLayout

                  log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n

          也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。

            2、如何在同一类中输出多个日志文件呢

              (1)先在Test.java中定义:

                 private static Log logger1 = LogFactory.getLog("myTest1");

                 private static Log logger2 = LogFactory.getLog("myTest2");

          (2)配置log4j.properties文件

                 log4j.logger.myTest1= DEBUG, test1

                 log4j.appender.test1=org.apache.log4j.FileAppender

                 log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log

                 log4j.appender.test1.layout=org.apache.log4j.PatternLayout

                 log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n

                 log4j.logger.myTest2= DEBUG, test2

                 log4j.appender.test2=org.apache.log4j.FileAppender

                 log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log

                 log4j.appender.test2.layout=org.apache.log4j.PatternLayout

                 log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n

           也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。

 

      3、这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中?

                 Log4j  additivity 指是否输出到顶层包定义的Appender中,如com.test中定义了一个Appender A1,而com.test.demo中又定义了一个Appender A2,则程序运行时,
                com.test.demo中的类若有日志,则既会输出到A1中,又会输出到A2中,但有些时候,A2的处理可能比较专职化,不希望其日志掺杂到全局或高层的日志记录中,则可以
                使用additivity功能来实现。

           例:

                    下面为log4j的一个Appender配置:

                    log4j.appender.platform=org.apache.log4j.ConsoleAppender  
                    log4j.appender.platform.Target=System.out  
                    log4j.appender.platform.layout=org.apache.log4j.PatternLayout  
                    log4j.appender.platform.layout.ConversionPattern=[%d{ISO8601}] :%5p %c{1}:%L - %m%n  
  
                    log4j.appender.platform1=org.apache.log4j.RollingFileAppender  
                    log4j.appender.platform1.File=${LOG_DIR}/trace.log  
                    log4j.appender.platform1.MaxBackupIndex=100  
                    log4j.appender.platform1.MaxFileSize=5000000  
                    log4j.appender.platform1.layout=org.apache.log4j.PatternLayout  
                    log4j.appender.platform1.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n  
  
                    log4j.appender.platform2=org.apache.log4j.RollingFileAppender  
                    log4j.appender.platform2.File=${LOG_DIR}/trace2.log  
                    log4j.appender.platform2.MaxBackupIndex=100  
                    log4j.appender.platform2.MaxFileSize=5000000  
                    log4j.appender.platform2.layout=org.apache.log4j.PatternLayout  
                    log4j.appender.platform2.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n  
  
                    log4j.appender.platform3=org.apache.log4j.RollingFileAppender  
                    log4j.appender.platform3.File=${LOG_DIR}/trace3.log  
                    log4j.appender.platform3.MaxBackupIndex=100  
                    log4j.appender.platform3.MaxFileSize=5000000  
                    log4j.appender.platform3.layout=org.apache.log4j.PatternLayout  
                    log4j.appender.platform3.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n

                     log4j.logger.com.sgcc=debug, platform1
                    log4j.additivity.com.sgcc.test=false
                    log4j.logger.com.sgcc.test.p1=debug, platform2
                    log4j.logger.com.sgcc.test.p2=debug, platform3

                    应用程序顶层包com.sgcc输出调试级别的信息,使用的Appender为platform1,日志输出到文件trace.log。

                    com.sgcc.test.p1包输出调试级别的信息,使用Appender为platform2,日志输出到文件trace2.log。

                    com.sgcc.test.p2包输出调试级别的信息,使用Appender为platform3,日志输出到文件trace3.log。

四、日志信息格式中几个符号代表的特殊含义
          (1) -X号: X信息输出时左对齐; 
          (2) %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, 
          (3) %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 
          (4) %r: 输出自应用启动到输出该log信息耗费的毫秒数 
          (5) %c: 输出日志信息所属的类目,通常就是所在类的全名 
          (6) %t: 输出产生该日志事件的线程名                 
          (7) %l: 输出日志事件的发生位置,,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 
          (8) %%: 输出一个"%"字符 
          (9) %F: 输出日志消息产生时所在的文件名称 
          (10) %L: 输出代码中的行号 
          (11) %m: 输出代码中指定的消息,产生的日志具体信息
          (12)  %n: 输出一个回车换行符,Windows平台为"rn  ",Unix平台为‘n’
         输出日志信息换行可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
          1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 
          2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 
          3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 
          4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。


五、commons-logging + Log4j的使用(推荐使用)
    1、为什么要使用commons-logging + Log4j
             commons-logging 是Apache下的开源项目,目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦。但它自身的日志功能比 较弱(只有一个简单  
        的  SimpleLog),所以一般不会单独使用它。Log4j的功能非常强大,是目前最主流的java日志工具。结合使用两者可以避免使项目与log4j紧密耦合,用户既可以轻松切换到其
        他日志工具,同时又可以使用log4j的强大功能。 强调一点,“同时使用commons -logging和Log4j”,与“单独使用Log4j”相比,并不会带来更大的学习、配置和维护成本,反而更    
        加简化了我们的工作。这也是为什么“所有用到Log4j的项目一般也同时会用到commons- loggin”的原因之一吧。
    2、如何使用commons-logging + Log4j
         (1) 引入 commons-logging-1.2.jar、( log4j-1.2.17.jar)
         (2)src根目录下放进commons-logging.properties文件,进行配置使用哪个第三方日志包。
                #定义了使用的具体第三方的日志包
                #org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
                org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
                #org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
                #org.apache.commons.logging.Log=org.apache.commons.logging.impl.LogKitLogger
                #org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
                #org.apache.commons.logging.Log=org.apache.commons.logging.impl.AvalonLogger
         (3)程序中调用
                import  org.apache.commons.logging.Log;
                import  org.apache.commons.logging.LogFactory;
                public static  Log log = LogFactory.getLog(test. class);
                    log .error(" 成功关闭链接");
                LogFactory.getLog(test.class)的调用过程:调用该函数会启动一个发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程在下面列出
                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;


通常会见到两种使用方法:

1、使用org.apache.commons.logging.Log类:

例如private final Log log = LogFactory.getLog(getClass());

2、直接使用log4j的Logger类:

获得rootLogger:Logger rootLogger=Logger.getRootLogger();­

获得自定义Logger:Logger myLogger =Logger.getLogger("log4j.logger.myLogger");­

区别

LogFactory来自common-logging包。如果用LogFactory.getLog:

优点:你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。

缺点:需要多一个common-logging包

 

Logger来自log4j自己的包。如果用Logger.getLogger:

优点:你只需要一个log4j的jar包。

缺点:你只能用log4j作为日志记录器,因为log4j已经硬编码进你的系统了。

apache的common-logging包是通用日志接口,通过这个中间层,你可以通过其配置文件commons-logging.properties,来指定到底用哪个日志系统,以此增加系统的灵活性。



        Logger.getLogger和LogFactory.getLog的区别
    LogFactory来自common-logging包。如果用LogFactory.getLog,你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。apache的common-logging包是通用日志接口,通过这个中间层,你可以随便指定到底用哪个日志系统。增加系统的灵活性。若log4j它不存在, 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 ,一般不使用 commons-logging 的配置文件,也不设置与 commons-logging 相关的系统环境变量,而只需将 Log4j 的 Jar 包放置到 classpash 中就可以了。这样就很简单地完成了 commons-logging 与 Log4j 的融合。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值