一、问题引出
日志对于一个成熟的项目来说是比不课少的。当项目运行上线,运行出错的时候,可以通过日志记录。然后开发人员通过日志反馈的信息找到错误的根源,进而修改之。
二、Java项目中日志的记录-----Log4J的使用
java项目中,使用最广泛的应该就是Log4j了吧。Log4j是apache下的开源项目,通过使用Log4j,我们可以很容易的把日志信息输送到控制台,文件,数据库等。
三、Log4j详细内容
1) Log4j主要由三部分组成:
loggers:负责捕获记录信息
appenders:负责发布日志信息,选择不同的日志输出目的地
layouts:负责日志输出内容的格式化操作
2)Log4j的使用方式。可以建立项目的根目录下定义一个Log4j.properties配置文件,里面定义内容如下:
#设置日志输出级别
log4j.rootLogger=debug,A1,A2,A3
#设置输出到终端
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#设置日志的输出方式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#具体的方式,这是与PatternLayout一同使用的
log4j.appender.A1.layout.ConversionPattern=[%p] [time]:%d{yyyy-MM-dd HH:mm:ss} [from]:%c [detail]:%m [position]:%l%n
#设置日志信息输出到文件
log4j.appender.A2=org.apache.log4j.FileAppender
#ERROR级别以上的内容才会被输出
log4j.appender.A2.Threshold=ERROR
#日志输出格式
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%p] [time]:%d{yyyy-MM-dd HH:mm:ss} [from]:%c [detail]:%m [position]:%l%n
#文件的存储地址,如果不存在,就会创建这个文件
log4j.appender.A2.File=F:/test.log
#输出到html文档中
log4j.appender.A3=org.apache.log4j.FileAppender
#指定输出地址
log4j.appender.A3.File=F:/test.html
#ERROR级别以上的内容才会被输出
log4j.appender.A3.Threshold=ERROR
#以html格式输出
log4j.appender.A3.layout=org.apache.log4j.HTMLLayout
#设置网页标题
log4j.appender.A3.layout.Title=MyLog
#设置为true后可以定位日志出错位置,建议使用
log4j.appender.A3.layout.LocationInfo=true
log4j.rooterLogger :log4j的根记录器,它用来定义日志的记录级别以及日志的输出地址。Log4j常用的日志输出四个级别为按照优先级从高到低分别是ERROR>WARN>INFO>DEBUG。当定义了一个日志输出优先级的时候,低于这个优先级的内容不会输出。举个例子:如果定义的日志优先级为INFO,那么DEBUG的内容不会被输出。 上面的例子当中使用的日志优先级别为DEBUG,在开发中一般定义为这个级别,在项目上线后,将级别再改为INFO.
|- log4j.appender.A1=org.apache.log4j.ConsoleAppender:指定日志的输出目的地。
输出的目的地有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
|-log4j.appender.A1.layout:layout用来设置日志的输出格式:定义的日志格式有
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
对于patternLayout,Log4j官方给出了布局使用的方式:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%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)
四、Log4j测试
通过测试加载配置文件。
public class LogTest {
public static Logger logger= Logger.getLogger(LogTest.class);
@Test
public void test1() {
try {
System.out.println(1 / 0);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}
日志文件中内容:
[ERROR] [time]:2017-11-16 22:03:05 [from]:com.itschool.test.LogTest [detail]:/ by zero [position]:com.itschool.test.LogTest.test1(LogTest.java:24)
HTML文档中内容:
五、Log4j的优缺点
优点:便于项目的维护,配置好的日志可以准确找到代码的错误位置
缺点:减缓项目的运行,如果上面的项目使用DEBUG方式运行,那么会明显感受到速度减慢。
六、Log4j与slf4j的整合
现在不只是单纯的使用log4j记录日志了,有一个原因是当如果不用Log4j记录日志改用其他的了,那么又要重新修改代码。但是有了slf4j之后,当需要更换,只需要更换jar包就行。减少了耦合度。
所需jar包:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
整合后使用方式,通过LoggerFactory获得Logger:
public class LogTest {
public static Logger logger= LoggerFactory.getLogger(LogTest.class);
@Test
public void test1() {
try {
System.out.println(1 / 0);
} catch (Exception e) {
logger.error(e.getMessage());
}
}
}
ps:如有不对,请指出~~