个人博客:兰陵笑笑生,欢迎浏览博客!java
上一章 SpringBoot入门实践(四)-RESTFUL API 最佳设计当中,咱们介绍了在SpringBoot项目中如何规范的使用RESTful风格的API,。本章简单介绍一下经常使用的开源日志框架。web
日志是程序设计中很重要的一部分,固然在我刚接触编程的时候,是不怎么在乎的,正好有空概括总结一下。spring
在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
pom.xml引入编程
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency>
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,工厂就是LogFactoryImplsegmentfault
#指定日志对象 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger #指定工厂 org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
Log4j是java编写的可靠的、灵活的日志框架,经过使用Log4j 咱们可以方便的记录日志,不但弄控制日志的输出,还能控制日志的输出格式:性能优化
ALL、 DEBUG 、INFO 、WARN、 ERROR、 FATAL 、OFFapp
日志的输出地方框架
经常使用的包括
固然还能够写入数据库,异步打印等等高级功能。
格式化
通常用都是自定义用的比较多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默认的Apperders使用同步的锁来实现。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>1.3.8.RELEASE</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency>
和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的实现
看看spring-boot-start-logging的依赖
springBoot当中的spring-boot-start-logging默认引入
Logback是由Log4j的创始人设计的另外一个日志组件,它也是目前首选的主流日志记录工具。
咱们所学习的springBoot就是默认使用Locback+Slf4j。
logback 分为3个部分
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配置
<?xml version="1.0" encoding="UTF-8"?><configuration> <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> --> <!--自定义的pattern属性--> <property name="pattern" value="%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger] %msg%n "/> <!--控制台输出--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${pattern}</pattern> <charset>GBK</charset> </encoder> </appender> <!--滚动记录日志--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--当前生成的日志文件名称--> <file>D:\\log\\logback.out</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--根据时间记录日志--> <fileNamePattern>test-log-%d{yyyy-MM-dd}.log</fileNamePattern> <!--归档日志30天--> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>${pattern}</pattern> <charset>GBK</charset> </encoder> </appender> <logger name="org.springframework.web" level="INFO"/> <!--根root logger 配置--> <logger name="test" level="DEBUG"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </logger> </configuration>
Logback相对于Log4j的最大提高是效率,在关键的执行路径上性能提高了至少10倍。同步记录日志大概是1.5万/s的吞吐量。
以上就是本期的分享,你还能够关注本博客的#Spring Boot入门实践系列!#
本文由博客一文多发平台 OpenWrite 发布!
个人博客[兰陵笑笑生] ( http://www.hao127.com.cn/),欢...!