我的博客:兰陵笑笑生,欢迎浏览博客!
上一章 SpringBoot入门实践(四)-RESTFUL API 最佳设计当中,我们介绍了在SpringBoot项目中如何规范的使用RESTful风格的API,。本章简单介绍一下常用的开源日志框架。
前言
日志是程序设计中很重要的一部分,当然在我刚接触编程的时候,是不怎么在意的,正好有空归纳总结一下。
在JDK1.4版本之后才有JDK Logger,不过JDK的日志太鸡肋,这里不过多介绍,开源社区当中应用比较广泛的是Apache Commons Logging和Apache Log4j ,Apache Commons Logging是通用的日志API ,Apache Log4j才是很流行的日志实现。后来Slf4j和Logback取代了Apache Commons Logging和Apache Log4j 。
一、Apache Commons Logging
-
简介:
Apache Commons Logging 提供了日志的接口,具体的实现根据配置动态调整,它的出现避免了和具体日志实现框架的直接耦合,在日常开发中,可以选择第三方的日志:’
-
使用方式
pom.xml引入
commons-logging
commons-logging
1.1.1
package test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
public class CommonLogDemo {
private Log log=LogFactory.getLog(CommonLogDemo.class);
@Test
public void test(){
log.debug("debug .....");
log.info("info .....");
log.warn("warn .....");
log.error("error .....");
log.fatal("fatal .....");
}
}
resource目录下添加commons-logging.properties,如果单纯的使用commons-logging,默认的日志对象就是Jdk14Logger,工厂就是LogFactoryImpl
#指定日志对象
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#指定工厂
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
二、Apache Log4j
-
简介
Log4j是java编写的可靠的、灵活的日志框架,通过使用Log4j 我们能够方便的记录日志,不但弄控制日志的输出,还能控制日志的输出格式:
日志级别:
ALL、 DEBUG 、INFO 、WARN、 ERROR、 FATAL 、OFF
Appender :
日志的输出地方
常用的包括
- ConsoleAppender控制台
- FileAppender 文件
- RollingFileAppender 滚动
- DailyRollingFileAppender
当然还可以写入数据库,异步打印等等高级功能。
Layout
格式化
HTMLLayout XML形式输出
PatternLayout 使用自定义的格式输出
SimpleLayout 只包含日志信息的级别和信息字符串
TTCCLayout 包括时间、线程,类别等
一般用都是自定义用的比较多PatternLayout
-
使用方式
public class LoggerDemo {
org.apache.log4j.Logger log= org.apache.log4j.Logger.getLogger(LoggerDemo.class); @Test
public void test(){
log.trace("trace log ...");
log.debug("debug log ...");
log.info("info log ...");
log.warn("warn log ...");
log.error("error log ...");
}
}
在resource目录下添加log4j.properties或者log4j.xml log4j会自动解析
log4j.properties
log4j.rootLogger=INFO, FILE,CONSOLE
#配置输出到控制台#1 ConsoleAppender控制台 2FileAppender 文件 3 RollingFileAppender 滚动 4 DailyRollingFileAppender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.ImmediateFlush=truelog4j.appender.CONSOLE.Threshold=DEBUG
#layout对日志格式化# 1自定义格式,PatternLayout2
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.encoding=UTF-8
##格式 : %时间 [%线程] %log级别 %完整类名 - %消息 %换行
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd
#HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
#%c 输出所属的类目,通常就是所在类的全名
#%L 代码中的行数。
#%m 输出代码中指定的消息
# 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
log4j.appender.CONSOLE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
#配置输出到文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=D:\\log\\log.log
log4j.appender.FILE.ImmediateFlush=truelog4j.appender.FILE.Threshold=DEBUGlog4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.encoding=UTF-8
log4j.appender.FILE.layout.conversionPattern=%d{ABSOLUTE} %5p %c{1}:%L- %m%n
-
Log4j的锁和性能优化
通常来说,打日志总比不打印日志要好,产生问题是有据可查,但是存在太多的日志,会使服务性能下降。,Log4J默认的Apperders使用同步的锁来实现。
日志事件异步打印
可以使用Log4j 的 AsyncAppender来实现异步打印,
-
springBoot修改底层日志为log4j
第一步:添加springBoot的log4j依赖
org.springframework.boot
spring-boot-starter-log4j
1.3.8.RELEASE
第二步 :排除springBoot默认的logging
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
第三步:resourece目录下添加log4j.properties文件或者log4j.xml
三、Slf4j(Simple Logging Facade for Java)
-
简介
和Apache Commons Logging,使用门面模式对外提供统一的接口,应用程序只依赖于Slf4j来实现打印日志,
具体的日志实现由配置来决定使用Log4j还是Logback,在不改变应用代码前提下,切换底层的日志实现。
springBoot就是实现了这种方式,底层使用slf4j+logback的方式进行日志记录 :
Slf4j任然使用了门面模式,相对于Commons Logging做了一些优化,它在编译的时候确定底层的实现,而不是通过配置文件动态的状态底层的实现。,所以只要底层的日志实现的jar包和Slf4j的静态编译转换包在类路径下即可。
从图上我们可以看到Slf4j的实现结构,除了Logger和LoggerFactory还有一个LoggerFactoryBinder,主要是实现转接器。
什么意思呢,就是Slf4j对每一种日志实现的框架都提供了一个转换的Jar包,这个Jar包包含了LoggerFactoryBinder接口的实现,比如:Logback转接的Jar包就是logback-classic-1.0.13.jar,提供了LoggerFactoryBinder的实现
-
SLF4J对不同日志的转接包
-
在springBoot中
底层使用slf4j+logback的方式进行日志记录
其他日志会转换成slf4j
看看spring-boot-start-logging的依赖
springBoot当中的spring-boot-start-logging默认引入
四、Logback
-
简介
Logback是由Log4j的创始人设计的另一个日志组件,它也是目前首选的主流日志记录工具。
我们所学习的springBoot就是默认使用Locback+Slf4j。
logback 分为3个部分
logback-core:是以下2个模块的基础,包括日志的实现
logback-classic :是Log4j的改良版本,在性能方面有较大的提高,并实现了上文说到的接口。
logback-access:与Servlet集成,提供了丰富的Http访问日志功能
-
logback-classic结构:
-
使用方式
package test;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackDemo {
Logger logger = LoggerFactory.getLogger(LogbackDemo.class);
@Test
public void Loback() {
logger.debug("debug ..."
);
logger.info("info ...");
logger.error("info ...");
logger.warn("info ...");
}
}
在resource目录下添加logback.xml配置
${pattern}
GBK
D:\\log\\logback.out
test-log-%d{yyyy-MM-dd}.log
30
${pattern}
GBK
Logback相对于Log4j的最大提升是效率,在关键的执行路径上性能提升了至少10倍。同步记录日志大概是1.5万/s的吞吐量。
五、总结
以上就是本期的分享,你还可以关注本博客的#Spring Boot入门实践系列!#
本文由博客一文多发平台 OpenWrite 发布!