log4j是Apache开源的日志框架,目前最新的版本为 1.2.XX; 2.0.XX版本正在开发中,没有发布正式版本.
日志信息非常重要:开发阶段,很有必要打印出一些重要的信息,和变量值等,便于功能调试;而产品阶段,项目运行稳定,需要记录敏感的修改信息,无须打印很多的日志信息,因而需要将日志信息去掉;因此,能够控制日志级别,对于项目开发来说,非常的重要。
代码中添加日志输出,肯定要消耗一部分资源,降低代码的运行效率。因此,使用高效率的日志框架很有必要。
目前,Log4j之父又开发了一款新的日志框架--logback,替换原来的log4j。
logback执行效率要比log4j高出许多,而且资源占用较少。
简单入门
使用log4j非常简单,按照一下步骤即可成功使用Log4j:
1. 引入log4j的jar包;使用Maven时,依赖如下:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 创建Log4j的配置文件(默认名称为log4j.properties)
配置文件中设置了log4j日志的级别(有效值为:debug,info,warn,error);日志输出的位置(控制台,文件,数据库等地方);以及日志的格式;
log4j.properties文件内容如下:
#log4j日志级别(debug,info,warn,error),输出位置(可同时输出到多个位置) log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender #log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout #log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%
log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize= 100KB log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n |
3. 在代码中添加以下语句,即可使用Log4j进行日志输出:
//获取日志对象 private static Logger logger = Logger.getLogger(Log4jDemo.class); |
如上3步,即可使用Log4j日志框架,Demo代码如下:
package com.main; import org.apache.log4j.Logger;
public class Log4jDemo { //获取日志对象 private static Logger logger = Logger.getLogger(Log4jDemo.class);
public static void main(String[] args) { logger.debug("this is an debug level log"); logger.info("this is an info level log"); logger.warn("this is an warn level log"); logger.error("this is an error level log"); } } |
Log4j的核心
Log4j的核心为配置文件!!!
配置文件为.properties 或者 .xml 格式(一般使用.properties),默认名称为log4j;包含一下部分:
Logger:完成日志信息的处理,决定信息是否输出;Log4j日志的输出是按照优先级输出,当设定某一日志级别时,只有大于等于该级别的日志才会输出;日志级别有效值如下(其中最常用的为蓝色字体显式):
all < trace < debug < info < warn < error < fatal < off
Appender:设置日志信息的去向(输出位置);常用的几个输出位置如下:
org.apache.log4j.ConsoleAppender;(控制台)
org.apache.log4j.FileAppender;(文件)
org.apache.log4j.DailyRollingFileAppender;(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender;(文件达到指定大小时产生新的日志文件)
org.apache.log4j.WriterAppender;(以流的方式发送到指定地方)
org.apache.log4j.JdbcAppender;(将日志信息保存到数据库中)
Layout:设置日志信息的输出样式;常用的几个样式如下:
org.apache.log4j.TTCCLayout;(包含日志产生的时间,线程名称,日志级别等信息)
org.apache.log4j.SimpleLayout;(包含日志信息的级别和信息字符串)(该样式不常用)
org.apache.log4j.HTMLLayout;(HTML表格形式)
org.apache.log4j.PatternLayout;(可以灵活地指定布局模式)
其中PatternLayout样式最为复杂,也最为常用。Log4J采用类似C语言中的printf函数的打印格式来格式化日志信息,各参数解释如下:
%m 输出代码中指定的消息;
%p 输出日志级别,即DEBUG,INFO,WARN,ERROR等;
%r 输出自应用启动到输出该log信息耗费的毫秒数;
%c 输出日志信息所属类的类全名;
%f 输出日志信息所属类别的类别名;
%t 输出产生该日志事件的线程名;
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”;
%d 输出日志时间点的日期或时间,默认格式为ISO8601;也可指定格式,如:%d{yyy MMM dd HH:mm:ss};
%l 输出日志事件的发生位置:包括类全名,线程名,以及在代码中的行数;
高级设置
在项目中,可能对于不同的包设置不同的日志级别,设置方法如下:
log4j.rootLogger=debug, stdout #特殊指定com.dao包的日志级别和输出 log4j.logger.com.test=warn, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout
log4j.appender.R=org.apache.log4j.FileAppender log4j.appender.R.File=example.log log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n |
几个常用的Log4j全部配置Demo:
#log4j日志级别(DEBUG,INFO,WARN,ERROR),输出位置(可同时输出到多个位置) #log4j.rootLogger=DEBUG, stdout, FILE, ROLLING_FILE, MAIL, DATABASE log4j.rootLogger=INFO, stdout, FILE #记录到标准输出(控制台) log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.Encoding=UTF8 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyy-MM-dd HH:mm:ss} [%p] %l - %m%n #记录到文件 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.Append=true log4j.appender.FILE.Encoding=UTF8 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d{yyy-MM-dd HH:mm:ss} [%p] %l - %m%n #记录到回滚文件 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=WARN log4j.appender.ROLLING_FILE.File=rolling_file.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.Encoding=UTF8 log4j.appender.ROLLING_FILE.MaxFileSize=10M log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{yyy-MM-dd HH:mm:ss} [%p] %l - %m%n #将日志发送邮件 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=ERROR log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.SMTPHost=www.baidu.com [email protected] [email protected] log4j.appender.MAIL.Subject=Log4j Message log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=%d{yyy-MM-dd HH:mm:ss} [%p] %l - %m%n #将日志保存到数据库 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.Threshold=INFO log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/xxx log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=log4j log4j.appender.DATABASE.password=log4j log4j.appender.DATABASE.sql=INSERT INTO SYS_LOG(message) VALUES('%p %t %c - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=%d{yyy-MM-dd HH:mm:ss} [%p] %l - %m%n
使用xml文件格式的配置,可参考相关文档,不在此记录。