OK,如今咱们来研究输出低Appended。html
Log4j日志系统容许把日志输出到不一样的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
Log4j内置了经常使用的输出地,通常状况下配置一下便可使用,全部的Appender都实现了自org.apache.log4j.Appender接口。在log4j.properties中,Appended都使用log4j.appender.*配置。
正则表达式
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点解释:
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文件中。apache
如今咱们来检查下控制台输出没有问题,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)]: 人工抛出一个异常
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
按日期滚动文件输出DailyRollingFileAppender将日志输出到指定的文件,当日期发生变化时,会将文件按照指定的日期格式自动更名。日期滚动文件输出类为org.apache.log4j.DailyRollingFileAppender。
配置文件以下:app
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-wwspa
3. 每个月:’.’YYYY-MM
4. 每隔半天:’.’YYYY-MM-dd-a
5. 每小时:’.’YYYY-MM-dd-HH
6. 每分钟:’.’YYYY-MM-dd-HH-mm
OK,上面我整理了最经常使用的几种Appender,他们就是ConsoleAppender(控制台),FileAppender(文件),RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),DailyRollingFileAppender(天天产生一个日志文件)。剩下的几种咱们通常不会用到,这里也就不作赘述了。如今咱们来整理下这4种Appender的关系。
上面的4种Appender都实现了Appender接口,而后ConsoleAppender和FileAppender同级别,FileAppender之下衍生出了2个子类RollingFileAppender,DailyRollingFileAppender。关于这些我会在后面的源码系列中仔细的整理到的。