zoukankan      html  css  js  c++  java
  • Log4j扩展使用--输出地Appender


    OK,现在我们来研究输出低Appended。

    • Appender控制日志输出的位置

    Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
    Log4j内置了常用的输出地,一般情况下配置一下即可使用,所有的Appender都实现了自org.apache.log4j.Appender接口。在log4j.properties中,Appended都使用log4j.appender.*配置。

    • 常用的输出位置有如下几个:
    ConsoleAppender(控制台)
    FileAppender(文件)
    RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    DailyRollingFileAppender(每天产生一个日志文件)
    JDBCAppender(输出到JDBC数据库)
    SocketAppender(远程日至服务器)     
    WriterAppender(将日志信息以流格式发送到任意指定的地方)
    SMTPAppender(发送邮件)      


    • 配置时使用方式为:
    log4j.appender.appenderName=fully.qualified.name.of.appender.class
    log4j.appender.appenderName.option1=value1
    …log4j.appender.appenderName.optionN=valueN
    也可以自己实现Appender接口, 这样就为日志的输出提供了相当大的便利。


    这里我们来举几个例子,熟悉下常用的日志输出。


    • 1,输出到控制台
    控制台是最常用的输出地,前面的一系列博客我们用的例子都是在控制台输出。控制台输出实现类为org.apache.log4j.ConsoleAppender。
    下面是一份比较完整的log4j.properties配置文件:
    og4j.rootLogger=DEBUG,console
    
    # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
    #输出到控制台   
    log4j.appender.console=org.apache.log4j.ConsoleAppender  
    #设置输出样式   
    log4j.appender.console.layout=org.apache.log4j.PatternLayout 
    #日志输出信息格式为
    log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
    #DEBUG以上级别输出,Threshold,入口,临界值
    #log4j.appender.console.Threshold=DEBUG
    #日志编码方式
    #log4j.appender.console.Encoding=UTF-8
    #是否立即输出
    #log4j.appender.console.ImmediateFlush=true
    #使用System.error作为输出
    #log4j.appender.console.Target=System.error
    关于上面这份配置文件,有3点解释:
    1,我们在实际的配置文件中,"#"注释必须另起一行
    2,控制台输出需要配置layput属性,最常用的就是正则表达式格式。还有一些可选的属性,一般实际中不会怎么用到,Encoding设置编码方式,ImmediateFlush设置是否缓存,Target设置输出到System.out还是System.err。
    3,Threshold用来设置该Appender的级别,只对本Appender生效。所有的Appender都可通过设置Threshold来设置本Appender的启用级别。


    • 2,输出到文件
    文件输出FileAppender把日志输出到指定的文件中,文件输出的实现类为org.apache.log4j.FileAppender,配置时候需要用File指定文件名称。当然,这个路径可以使用相对路径,也可以使用绝对路径。
    下面一份文件输出的log4j.properties的配置文件:

    log4j.category.org.linkinpark.commons.logtest1=ERROR,file
    log4j.rootLogger=DEBUG,console
    
    # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
    #输出到控制台   
    log4j.appender.console=org.apache.log4j.ConsoleAppender  
    #设置输出样式   
    log4j.appender.console.layout=org.apache.log4j.PatternLayout 
    #日志输出信息格式为
    log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
    #DEBUG以上级别输出,Threshold,入口,临界值
    #log4j.appender.console.Threshold=DEBUG
    #日志编码方式
    #log4j.appender.console.Encoding=UTF-8
    #是否立即输出
    #log4j.appender.console.ImmediateFlush=true
    #使用System.error作为输出
    #log4j.appender.console.Target=System.error
    
    
    
    #输出到文件(这里默认为追加方式)   
    log4j.appender.file=org.apache.log4j.FileAppender 
    #输出文件位置
    log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
    log4j.appender.file.Append=true
    #样式为TTCCLayout   
    #log4j.appender.file.layout=org.apache.log4j.TTCCLayout
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
    关于上面的配置文件我这里解释一下:

    1,可选参数Append配置是否在源文件内容的基础上追加日志。如果是false,Logger初始化会先情清掉文件内容,也就是说每次重启程序,原来的日志就会丢失。如果为true,日志文件就会越来越大。默认为true。

    2,我们上面用category属性来重新定义我们的自己的logtest1包下面的日志输出,然后指定日志输出到/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log文件中。

    现在我们来检查下控制台输出没有问题,category继承了默认的rootLogger在控制台输出了,而且还在我们上面指定的路径下的日志文件中追加进去了日志内容。

    ➜  WorkSpace  cd linkin-log-test 
    ➜  linkin-log-test  ls
    pom.xml src     target
    ➜  linkin-log-test  pwd
    /Users/LinkinPark/WorkSpace/linkin-log-test
    ➜  linkin-log-test  ls  
    log     pom.xml src     target
    ➜  linkin-log-test  cd log 
    ➜  log  ls
    log4j.log
    ➜  log  more log4j.log 
    [2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(30)]: error级别的日志输出
      [2016-02-23 09:52:48]-[main-FATAL]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(31)]: fatal级别的日志输出
      [2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(38)]: 人工抛出一个异常


    • 3,输出到按大小滚动文件
    按大小滚动文件输出RollingFileAppender把日志输出到指定的文件,文件达到指定的大小时,就会自动更名。按尺寸滚动文件输出类为org.apache.log4j.RollingFileAppender,需配置文件名称,文件的最大尺寸。
    下面是一份配置文件:

    log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file
    log4j.rootLogger=DEBUG,console
    
    # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
    #输出到控制台   
    log4j.appender.console=org.apache.log4j.ConsoleAppender  
    #设置输出样式   
    log4j.appender.console.layout=org.apache.log4j.PatternLayout 
    #日志输出信息格式为
    log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
    #DEBUG以上级别输出,Threshold,入口,临界值
    #log4j.appender.console.Threshold=DEBUG
    #日志编码方式
    #log4j.appender.console.Encoding=UTF-8
    #是否立即输出
    #log4j.appender.console.ImmediateFlush=true
    #使用System.error作为输出
    #log4j.appender.console.Target=System.error
    
    #输出到文件(这里默认为追加方式)   
    log4j.appender.file=org.apache.log4j.FileAppender 
    #输出文件位置
    log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
    #是否在原日志基础上追加输出日志。true,默认,追加。false,清掉原来日志重新添加
    log4j.appender.file.Append=true
    #样式为TTCCLayout   
    #log4j.appender.file.layout=org.apache.log4j.TTCCLayout
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  
    
    #按大小滚动文件(这里默认为追加方式)   
    log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender 
    #输出文件位置
    log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
    log4j.appender.rolling_file.Append=true
    #文件达到最大值自动更名
    log4j.appender.rolling_file.MaxFileSize=1KB
    #最多备份100个文件
    log4j.appender.rolling_file.MaxBackupIndex=100
    log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
    log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
    关于上面的配置文件解释如下:

    1,配置的滚动文件名为rolling_log4j,该文件在/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log路径中,我们设置了文件最大为1K。当rolling_log4j.log达到1K时,就会自动更名为rolling_log4j.log.1,rolling_log4j.log.2,rolling_log4j.log.3....直到rolling_log4j.log.100。
    2,Logger支持多个Appender,用逗号将多个Appender名字隔开即可。
    多次运行我们自己写的测试类,会发现rolling_log4j.log文件在滚动。下面我贴出具体的文件日志输出:

    ➜  linkin-log-test  cd log 
    ➜  log  ls -l
    total 16
    -rw-r--r--  1 LinkinPark  staff  1110  2 23 10:17 log4j.log
    -rw-r--r--  1 LinkinPark  staff   364  2 23 10:17 rolling_log4j.log
    ➜  log  ls -l 
    total 16
    -rw-r--r--  1 LinkinPark  staff  1850  2 23 10:18 log4j.log
    -rw-r--r--  1 LinkinPark  staff     0  2 23 10:18 rolling_log4j.log
    -rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
    ➜  log  ls -l
    total 24
    -rw-r--r--  1 LinkinPark  staff  2220  2 23 10:18 log4j.log
    -rw-r--r--  1 LinkinPark  staff   364  2 23 10:18 rolling_log4j.log
    -rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
    ➜  log  ls -l
    total 24
    -rw-r--r--  1 LinkinPark  staff  2590  2 23 10:19 log4j.log
    -rw-r--r--  1 LinkinPark  staff   728  2 23 10:19 rolling_log4j.log
    -rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
    ➜  log  ls -l
    total 24
    -rw-r--r--  1 LinkinPark  staff  2960  2 23 10:19 log4j.log
    -rw-r--r--  1 LinkinPark  staff     0  2 23 10:19 rolling_log4j.log
    -rw-r--r--  1 LinkinPark  staff  1092  2 23 10:19 rolling_log4j.log.1
    -rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.2


    • 4,输出到按日志滚动文件

    按日期滚动文件输出DailyRollingFileAppender将日志输出到指定的文件,当日期发生变化时,会将文件按照指定的日期格式自动改名。日期滚动文件输出类为org.apache.log4j.DailyRollingFileAppender。
    配置文件如下:

    log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file,daily_rolling_file
    log4j.rootLogger=DEBUG,console
    
    # 以下是rootLogger的配置,子类默认继承,但是子类重写下面配置=rootLogger+自己配置,我晕
    #输出到控制台   
    log4j.appender.console=org.apache.log4j.ConsoleAppender  
    #设置输出样式   
    log4j.appender.console.layout=org.apache.log4j.PatternLayout 
    #日志输出信息格式为
    log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
    #DEBUG以上级别输出,Threshold,入口,临界值
    #log4j.appender.console.Threshold=DEBUG
    #日志编码方式
    #log4j.appender.console.Encoding=UTF-8
    #是否立即输出
    #log4j.appender.console.ImmediateFlush=true
    #使用System.error作为输出
    #log4j.appender.console.Target=System.error
    
    #输出到文件(这里默认为追加方式)   
    log4j.appender.file=org.apache.log4j.FileAppender 
    #输出文件位置
    log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
    #是否在原日志基础上追加输出日志。true,默认,追加。false,清掉原来日志重新添加
    log4j.appender.file.Append=true
    #样式为TTCCLayout   
    #log4j.appender.file.layout=org.apache.log4j.TTCCLayout
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  
    
    #按大小滚动文件(这里默认为追加方式)   
    log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender 
    #输出文件位置
    log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
    log4j.appender.rolling_file.Append=true
    #文件达到最大值自动更名
    log4j.appender.rolling_file.MaxFileSize=1KB
    #最多备份100个文件
    log4j.appender.rolling_file.MaxBackupIndex=100
    log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
    log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
    
    #按日期滚动文件
    log4j.appender.daily_rolling_file=org.apache.log4j.DailyRollingFileAppender 
    #输出文件位置
    log4j.appender.daily_rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/daily_rolling_log4j.log
    #文件滚动日期格式
    log4j.appender.daily_rolling_file.DatePattern=.yyyy-MM-dd
    log4j.appender.daily_rolling_file.layout=org.apache.log4j.PatternLayout
    log4j.appender.daily_rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
    关于上面的配置文件解释如下:

    1,上面的配置中,我们新添加DailyRollingFileAppender类型的Appender。我们的日志文件名称为daily_rolling_file,日期格式为yyyy-MM-dd。进入到新的一天后,文件就会被自动更名,格式为daily_rolling_file.2008-08-08。

    每天:’.’YYYY-MM-dd(默认)

    2.       每星期:’.’YYYY-ww

    3.       每月:’.’YYYY-MM

    4.       每隔半天:’.’YYYY-MM-dd-a

    5.       每小时:’.’YYYY-MM-dd-HH

    6.       每分钟:’.’YYYY-MM-dd-HH-mm


    2,这种配置也是可能我们在实际编码中最常用到的,项目发布到服务器上然后每天生成一个日志文件。


    OK,上面我整理了最常用的几种Appender,他们就是ConsoleAppender(控制台),FileAppender(文件),RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),DailyRollingFileAppender(每天产生一个日志文件)。剩下的几种我们一般不会用到,这里也就不做赘述了。现在我们来整理下这4种Appender的关系。

    上面的4种Appender都实现了Appender接口,然后ConsoleAppender和FileAppender同级别,FileAppender之下衍生出了2个子类RollingFileAppender,DailyRollingFileAppender。关于这些我会在后面的源码系列中仔细的整理到的。


  • 相关阅读:
    HTML_<select>
    HTML_<a>
    MySQL_知识点
    MySQL_常用SQL语句
    GIT
    MyBatis_传入参数的问题
    js函数防抖与节流总结
    node 常用方法 生成密钥 token验证 验证码生成 (持续更新)
    node 登陆拦截中间件(egg)
    js 给页面容器增加水印
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5232850.html
Copyright © 2011-2022 走看看