log4j的使⽤
⽇志的作⽤
便于分析程序执⾏过程
⽅便调试
可以将业务数据存储到⽂件、数据库,有利于后期分析
log4j简介
log4j是 Apache 的⼀个开源项⽬,通过设置⽇志级别来指定输出哪些类型的⽇志。log4j功能强⼤:
可以将⽇志信息输出到控制台、⽂件、GUI 组件、甚⾄是数据库中
可以控制每⼀条⽇志的输出格式
log4j的⽇志级别
log4j在 org.apache.log4j.Level 类中定义了七种⽇志级别,级别从⾼到低依次为:
OFF  最⾼⽇志级别,即关闭⽇志
FATAL  导致应⽤程序退出的错误
ERROR    运⾏发⽣错误,但仍不影响系统(程序)继续运⾏
WARN    警告,即潜在的错误情形
INFO  ⼀般⽤在粗粒度级别上,记录程序全程执⾏过程,强调应⽤程序的运⾏全程
DEBUG  ⼀般⽤于细粒度级别上,对调试应⽤程序⾮常有帮助
ALL    最低⽇志级别,记录所有级别的⽇志
⼀般只使⽤4个级别,优先级从⾼到低为 ERROR > WARN > INFO > DEBUG。
log4j的组成
log4j 主要由三部分组成:
(1) Loggers (⽇志记录器)    控制⽇志的输出级别与⽇志是否输出
(2)Appenders(输出端)指定⽇志的输出到哪个地⽅(输出到控制台、⽂件等),常⽤的输出端:
ConsoleAppender  将⽇志输出到控制台
FileAppender  将⽇志输出到⽂件中
RollingFileAppender  将⽇志信息输出到⼀个⽂件中,并指定⽂件尺⼨,当⽂件⼤⼩达到指定尺⼨时,会⾃动把⽂件改名,同时创建⼀个新的⽂件来保存⽇志DailyRollingFileAppender  将⽇志输出到⽂件中,会周期性输出到⼀个新的⽂件
JDBCAppender  把⽇志信息保存到数据库中
(3)Layout(⽇志格式化器),常⽤的格式化器类型:
HTMLLayout  格式化⽇志输出为HTML表格形式
SimpleLayout  简单的⽇志输出格式化
PatternLayout  最强⼤的格式化器,可⾃定义⽇志输出格式
log4j使⽤⽰例
(1)下载log4j,导⼊log4j.jar
注意是log4j,不是log4j2。
log4j的作者先开发了log4j,版本号以1开头。后⾯对log4j进⾏重构,改进了log4j的不⾜,即log4j2,版本号以2开头。log4j和log4j2的⽤法区别很⼤。
下载的log4j,有的版本含有log4j.jar、log4j-core.jar、log4j-api.jar3个jar包,我们只需导⼊log4j.jar。
(2)src下新建log4j的配置⽂件log4j.properties
### ⽇志记录器Logger的全局设置 ###
#第⼀个参数指定输出的最低⽇志级别,即只输出该级别及以上级别的⽇志
#后⾯的参数指定要进⾏哪些配置
### 设置控制台输出 ###
#stdout即standard out 标准输出,默认为控制台,所以可将stdout换为Console
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} method:%l%n%m%n ### 输出DEBUG及以上级别的⽇志到D:/logs/debug.log###
#配置时,输出级别⽤⾸字母表⽰,D即DEBUG
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#指定将⽇志输出到哪个⽂件中
log4j.appender.D.File = D:/logs/debug.log
#指定⽂件写⼊⽅式为追加
log4j.appender.D.Append = true
#指定最低输出级别
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.DatePattern='.'yyyy-MM-dd-HH-mm
#指定⽇志输出格式
log4j.appender.D.layout = org.apache.log4j.SimpleLayout
### 输出ERROR及以上级别的⽇志到D:/logs/error.log ###
log4j.appender.E = org.apache.log4j.RollingFileAppender
log4j.appender.E.File =D:/logs/error.log
log4j.appender.E.Append = truelog4j2不打印日志
log4j.appender.E.Threshold = ERROR
#指定⽇志⽂件的最⼤尺⼨
log4j.appender.E.MaxFileSize = 2KB
#指定最⼤备份数为5
log4j.appender.E.MaxBackupIndex = 5
#指定⽇志输出格式使⽤⾃定义格式
log4j.appender.E.layout = org.apache.log4j.PatternLayout
#指定⽇志格式
log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
此配置只是为了演⽰效果。
DailyRollingFileAppender 独有的选项
DatePattern='.'yyyy-ww
可选的值:
'.'yyyy-MM  每⽉
'.'yyyy-ww  每周
'.'yyyy-MM-dd  每天
'.'yyyy-MM-dd-a  每天两次
'.'yyyy-MM-dd-HH  每⼩时
'.'yyyy-MM-dd-HH-mm  每分钟
⽐如 '.'yyyy-MM-dd-HH-mm ,每分钟都产⽣⼀个同名的新⽂件来保存这分钟内的⽇志。
同名的新⽂件?就是在扩展名后加上时间,要查看需要改扩展名。
如果这分钟内没有⽇志输出,则不新建⽂件。
RollingFileAppender独有的选项
#指定⽇志⽂件的最⼤尺⼨
MaxFileSize = 2KB
#指定最⼤备份数为5
MaxBackupIndex = 5
最初的⽂件是error.log,达到指定的最⼤尺⼨后,把这个⽂件重命名为error.log.1(扩展名后⾯加索引),再新建⼀个error.log来保存⽇志。
error.log达到最⼤尺⼨后,把error.log.1重命名为error.log.2,把error.log重命名为error.log.1,再新建⼀个error.log来保存⽇志
.......
最多可有5个备份(1,2,3,4,5)。
有了5个备份,如果error.log达到了最⼤尺⼨,把error.log.5删除,将error.log.4重命名为error.log.5,error.log.3重命名为error.rror.log重命名为error.log.1,再新建⼀个error.log来保存⽇志。
⽇志输出格式
HTMLLayout
将⽇志以html代码的形式输出到指定⽂件中,将⽂件扩展名修改为.html即可查看效果:
SimpleLayout
级别 - ⽇志信息
DEBUG - This is debug message.
INFO - This is info message.
ERROR - This is error message.
PatternLayout
⾃定义格式,和 C 语⾔的 printf() 差不多,都是使⽤占位符:
%m  代码中指定的⽇志信息
%p    ⽇志级别,DEBUG、INFO 等
%n    换⾏符
%c    打印语句所属的类的全名
%t    产⽣该⽇志的线程全名
%d    服务器当前时间,可在后⾯指定格式,⽐如  %d{yyyy年MM⽉dd⽇ HH:mm:ss}
%l    ⽇志时间发⽣的位置,包括类名、发⽣的线程,以及在代码中的⾏数,如:Test.main(Test.java:10)
%F    ⽇志消息产⽣时所在⽂件的⽂件名
%L    代码所在⾏号
%%  输出⼀个 %
可指定宽度、对齐⽅式:
%5p    宽度是5,字符个数⼩于5时,默认右对齐
%-5p  宽度是5,字符个数⼩于5时,左对齐
(3)src下新建测试类test.Log4jTest
package test;
import org.apache.log4j.Logger;
public class Log4jTest {
public static void main(String[] args) {
// 获取当前类的Logger
Logger logger = Logger(Log4jTest.class);
// 输出DEBUG级别的⽇志,参数为⽇志信息
logger.debug("This is debug message.");
// 输出INFO级别的⽇志
logger.info("This is info message.");
// 输出ERROR级别的⽇志
<("This is error message.");
}
}
说明
log4j可单独使⽤,单独使⽤时只需添加log4j.jar包。
如果要在其他框架中使⽤log4j,⼀般还要下载添加apache的commons-logging.jar。
因为log4j实现了记录⽇志的功能,commons-logging.jar定义了⽇志接⼝,commons-logging本⾝并不具备记录⽇志的功能,⼆者的关系是接⼝-实现类的关系,引⼊commons-logging.jar,使得框架与⽇志的耦合从类降到了接⼝。
log4j的配置⽂件必须名为log4j.properties或l,且必须放在资源根⽬录下(src是默认的资源根⽬录)。
附  log4j常⽤配置
### ⽇志记录器Logger的全局设置 ###
#⽇志输出的最低级别设置为DEBUG
### 设置⽇志的控制台输出 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
#如果想查看程序的具体执⾏过程(在控制台输出DEBUG级的⽇志),把下⾯⼀⾏代码注释掉或把ERROR改为DEBUG即可
log4j.appender.stdout.Threshold = ERROR
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出⽇志到⽂件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File =D://log/debug/debug.log
log4j.appender.D.Append = true
#如果想把DEBUG级的⽇志输出到⽂件,把下⾯⼀⾏注释掉或把ERROR改为DEBUG即可
log4j.appender.D.Threshold = ERROR
log4j.appender.D.DatePattern='.'yyyy-ww
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n