Log4j的学习(附带与slf4j的整合)
一、问题引出
日志对于一个成熟的项目来说是比不课少的。当项目运行上线,运行出错的时候,可以通过日志记录。然后开发人员通过日志反馈的信息找到错误的根源,进而修改之。
二、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:如有不对,请指出~~