一个完整的项目里,日志是必不可少的,也是很重要的一部分。程序从开发,测试,维护,运行等环节,都需要向控制台等位置输出大量的信息,如果程序出了问题,那么这些信息能快速反映出问题的所在,帮助我们定位到问题。而且这些信息的输出,在很多时候是使用System.out.println()
无法完成的,而且使用System.out.println()
这是IO操作,这会拖慢系统的效率。
日志信息根据用途与记录内容的不同,可以分为调试日志,运行日志,异常日志等。
Log4j 全称为Log for java ,也就是专门用来记录java语言的日志记录工具。目前有两个版本,Log4j与Log4j2。
Log4j的下载地址:http://logging.apache.org/log4j/1.2/download.html
Log4j2的下载地址:http://logging.apache.org/log4j/2.x/download.html,下载是下载的是后缀为bin.zip,然后再解压即可。
使用上面的包的话,直接将下载的依赖包复制粘贴到项目的lib目录下,add to build path就可以了。
如果是使用Maven管理依赖的话,需要添加下面的依赖:
<!-- 日志文件管理包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试需要的包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
由于是使用Maven管理项目,所以在Resources目录下建立log4j.properties文件,如果是使用eclipse直接导包,那么log4j.properties文件应该放在与src相同级别的目录下。
下面是log4j.properties文件
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
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/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
#输出到的文件目录
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
#Debug
log4j.appender.D.Threshold = DEBUG
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
### 输出ERROR 级别以上的日志到=D://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
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
测试代码* MyTest.class *:
import org.apache.log4j.Logger;
public class MyTest {
private static Logger logger = Logger.getLogger(MyTest.class.getClass());
@org.junit.Test
public void test() {
// debug级别
logger.debug("这是一个debug级别的信息");
// info级别
logger.info("这是一个info级别的信息");
// error级别
logger.error("这是一个error级别的信息");
}
}
控制台输出结果:
查看日志文件信息我们可以看到:
如果我们需要输出sql语句,无法使用private static Logger logger = Logger.getLogger(MyTest.class.getClass());
这句代码,则只需要在log4j.properties文件里面添加
# mybatis的
#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
# 普通的sql的
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
如果需要在代码里面自己控制输出,使用:
// 定义一个static Logger对象
private static Logger logger = Logger.getLogger(MyTest.class.getClass());
在配置文件log4j.properties配置的话:
1.配置根Logger,也是最顶层,最重要的配置,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,OFF就是所有的信息都不会打印,ALL就是所有信息都会打印,DEBUG模式使用比较多,因为程序出错的时候我们需要去查看日志才能定位问题。
// off 最高等级,用于关闭所有日志记录。
// fatal 指出每个严重的错误事件将会导致应用程序的退出。
// error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
// warm 表明会出现潜在的错误情形。
// info 一般和在粗粒度级别上,强调应用程序的运行全程。
// debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
// all 最低等级,用于打开所有日志记录。
// 基本语法:log4j.rootLogger = [ level ] , appenderN1, appender1, …
// 比如下面的
log4j.rootLogger = debug,stdout,D,E
使用appender输出信息到目的地,每一个目的地后面都有自己的属性,我们可以进行定义。
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定大小的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
上面有一句log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
定义了日志输出的layout,那么layout的基本几种如下:
org.apache.log4j.HTMLLayout(HTML表格布局),
org.apache.log4j.PatternLayout(自定义布局),
org.apache.log4j.SimpleLayout(包含日志信息级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
自定义布局中,输出的时候的定义比如log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
,格式语法如下:
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出消耗的毫秒数
%c 输出类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,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)