首页 > 代码库 > Log4j学习笔记
Log4j学习笔记
(一)Log4j的三个主要组件:Loggers、Appenders 和 Layouts,这三个组件协同工作,使得开发人员能够根据消息的类型和级别来记录消息,并且在程序的运行期控制消息的输出格式及位置。
1. Logger:日志记录器,负责日志记录的大部分工作,是一个核心组件。
2. Appender: 日志信息的输出目的地,负责日志记录的输出控制。
3. Layout: 日志格式化器,负责格式化 Appender 的输出。
他们的关系图如下所示:
(二)日志的级别:
Log4j中的日志级别从低到高依次为: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF,他们被定义在
org.apache.log4j.Level类当中,通常日志级别是在日志的配置文件中设置(log4j.properties文件中配置的,后面会讲到的)。
OFF: 它的日志级别最高,表示不进行日志的记录。
FATAL: 表示严重的错误,会导致应用程序退出。
ERROR:表示一般可以纠正的错误,不影响应用程序的继续执行。
WARN: 警告级别的信息。
INFO: 应用程序执行的必要信息记录。
DEBUG: 便于调试的日志记录。
TRACE: 程序代码执行轨迹的日志记录。
ALL: 级别最低,所有的日志信息都将记录。
要实现这些日志级别,我们需要通过调用 Logger 的方法来实现日志请求,常用的方法有:debug(),info(),warn(),error(),fatal()。
(三)Log4j的使用案例
1. 导入开发包:log4j-1.2.17.jar
2. 在需要日志记录的程序中定义 Logger 的实例变量,通常的做法是:
private static final Logger logger = Logger.getLogger(XXX.class);
3. 在程序中调用相应的日志请求方法。
4. 编写配置文件,以此来说明日志的显示方式和级别(在src下创建log4j.properties文件)
(1) 首先创建Appenders
log4j.appender.A1=org.apache.log4j.ConsoleAppender
表示创建了一个appender,且名字为A1,使用输出策略是org.apache.log4j.ConsoleAppender(该类可以在 log4j API中找到)
(2) 说明日志的展示布局
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
表示字为A1的appender以何种布局来展示,这里常用的默认布局是PatternLayout
(3) 说明通过什么样的格式来完成日志的展示
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
它在控制台中展示的结果如下形式(其中的%-4r %-5p中的数字表示信息之间的间隔):
【
Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m :输出代码中指定的消息
%p :输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r :输出自应用启动到输出该log信息耗费的毫秒数
%c :输出所属的类目,通常就是所在类的全名
%t :输出产生该日志事件的线程名
%n :输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
%d :输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l :输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
】
(4) 在什么时候输出日志
log4j.rootLogger=DEBUG, A1(DEBUG日志级别,A1表示的是appender)
rootLogger表示根目录的 Logge r,每个项目的classpath就是根目录。表示只要有大于或等于DEBUG级别的日志,都会输出A1。
log4j.logger.log4j.dao=DEBUG,A1
表示在 log4j.dao 这个包中只要找到使用Logger logger = Logger.getLogger(XX.class)注入的类都会输出日志
5. 案例代码如下:
工程的目录结构:
配置文件(log4j.properties)信息:
log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ss} [%t] %37c %3x - %m%n#使用FileAppender将日志输出到文件中#log4j.appender.fout=org.apache.log4j.FileAppender#按日期产生一个新的文件#log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender#log4j.appender.fout.datePattern=‘.‘yyyy-MM-dd-HH-mm#按日志文件大小产生一个新文件log4j.appender.fout=org.apache.log4j.RollingFileAppenderlog4j.appender.fout.MaxFileSize=10#产生新文件时,标记新文件的索引log4j.appender.fout.MaxBackupIndex=50log4j.appender.fout.layout=org.apache.log4j.PatternLayout#通常在实际项目开发中,我们使用的是相对路径。常使用的方法是将路径设置到System.setProperty()方法#然后${key}来获取System.setProperty()中的值log4j.appender.fout.file=${LOG_DIR}/file.loglog4j.appender.fout.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n#表示classpath下的所有使用了日志记录的都会输出#log4j.rootLogger=DEBUG, A1#创建一个名称为test的logger,这个是基于名称的访问,即在你需要日志记录的类中使用#Logger logger = Logger.getLogger("test")来创建logger,但不建议使用这种方式#log4j.logger.test=WARN,fout#表示在log4j.service这个包中只要找到使用Logger logger = Logger.getLogger(XX.class)注入的类都会输出日志log4j.logger.log4j.service=WARN,foutlog4j.logger.log4j.dao=DEBUG,A1
dao 包中的类:
package log4j.dao;import org.apache.log4j.Logger;public class UserDao { private static final Logger logger = Logger.getLogger(UserDao.class); public void logInfo() { logger.debug("debug---用户信息"); logger.error("error---错误信息"); logger.warn("warn---警告信息"); logger.fatal("fatal---大量数据信息"); }}
service 包中的代码:
package log4j.service;import org.apache.log4j.Logger;public class UserService { private static final Logger logger = Logger.getLogger(UserService.class); public void logInfo() { logger.debug("debug---用户信息"); logger.error("error---错误信息"); logger.warn("warn---警告信息"); logger.fatal("fatal---大量数据信息"); }}
test 包中测试代码:
package log4j.test;import log4j.dao.UserDao;import log4j.service.UserService;import org.junit.Test;public class TestLog4j { @Test public void testOne() { UserDao dao = new UserDao(); dao.logInfo(); } @Test public void testService() { //设置相对路径的操作,对应到配置文件中的:log4j.appender.fout.file=${LOG_DIR}/file.log String uri = this.getClass().getClassLoader().getResource("").getPath(); uri = uri.replaceAll("bin/", "log"); System.setProperty("LOG_DIR", uri); System.out.println(uri); UserService service = new UserService(); service.logInfo(); }}
Log4j学习笔记