
本文共 3994 字,大约阅读时间需要 13 分钟。
日志是什么?它是用来记录事件发生的组件。就像小时候我们写日记一样,在什么时刻做了什么事情,这样就方便了后面的查询工作。在项目的开发中,日志是必不可少的,常见的日志框架有很多,如:JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback等等。
通常情况下,日志是由一个抽象层+实现层的组合来搭建的。如下:
日志-抽象层 | 日志-实现层 |
---|---|
JCL、SLF4J、jboss-logging | jul、log4j、log4j2、logback |
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。当启动SpringBoot程序时,控制台输出如下:
1、SLF4J的介绍
slf4j 是一个日志门面,具体的日志实现是由具体的日志框架实现的,比如 log4j、logback等日志框架。想要在程序中使用SLF4J,就需要导入SLF4J的jar 和Logback实现的jar。
引入依赖的包:
org.springframework.boot spring-boot-starter-logging
编写程序:
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class LogTest { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(LogTest.class); logger.info("success"); }}
结果如下:
但是,Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖,所以,无需额外添加依赖。其关系图如下:
在SLF4J官网给出了一张图,其中对应着使用不同实现日志的流程图(现在好像找不到了):
假如需要使用log4j做日志记录,则可以按照上图中的流程引入相关jar包。
2、统一日志的实现
在系统开发中可能想使用 slf4j + logback 进行日志输出,但是我们系统依赖的 spring、mybatis 框架可能使用的是其他日志框架,那我们如何统一面向 slf4j 进行日志输出呢?SLF4J官网还有一张图,如下:
假如程序使用slf4+Logback的日志实现、其他框架又是别的日志框架实现,现在要统一日志实现有以下两种情况:
(1)正常流程
如果当前项目中没有使用其他框架,现在要使用slf4j+logging的日志框架,此时应该走如下流程:
(2)整合流程
假设现在的SpringBoot项目中有spring、mabtis等其他框架,我们知道spring使用的日志是commons,如图所示中,先将spring框架中的commons.logging.jar移除,然后导入jcl-over-slf4j.jar,这个jar包就会去找到slf4j-api.jar中的接口实现日志框架。MyBatis亦是如此,用log4j-over-slf4j.jar替换log4j.jar。
简单来说,实现日志统一的基本步骤如下:
a.将系统中其他日志框架先排除出去
b.用中间包来替换原有的日志框架
c.导入slf4j其他的实现
如何从项目中移除不需要的依赖包?
以去除Spring框架的commons-logging为例,在pom.xml中加入如下配置:
org.springframework spring-core commons-logging commons-logging
3、SpringBoot中的日志配置
Spring Boot使用Logback记录日志,并用INFO级别输出到控制台,日志一般有以下5个级别,可以通过applicaiton.proerties文件中进行修改:
- ERROR 错误信息
- WARN 警告信息
- INFO 一般信息
- DEBUG 调试信息
- TRACE 跟踪信息
它们的优先级由低到高:trace<debug<info<warn<error 。设置日志级别越高其他日志级别会被输出出来、设置低级别就只有低级别本身和比自己级别低的输出、高级别的不会被输出。
import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class LogTest { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(LogTest.class); logger.trace("this is trace"); logger.debug("this is debug"); //SpringBoot的默认级别 logger.info("this is info"); logger.warn("this is warn"); logger.error("this is error"); }}
application.properties文件关于日志记录的属性介绍:
(1)修改日志级别
root级别:即项目的所有日志
package级别:即指定包下使用相应的日志级别
示例:
#root级别logging.level.root=info #package级别logging.level.com.yht=error
如果我们给定日志级别为warn,则此时启动SpringBoot项目的输出如下:
这个项目几乎没有输出内容,这是因为之前我们默认的级别是INFO,当设置为warn之后,info级别的信息就不会显示。
(2)将日志信息存储到文件
logging.path:该属性用来配置日志文件的路径
logging.file:该属性用来配置日志文件名,如果该属性不配置,默认文件名为spring.log
示例:
# 按照默认的名称spring.log,生成到指定路径及日志。logging.path=output/logs# 不指定的情况下默认生成在项目根目录,按照配置生成所需的日志名称logging.file=D:/java/yht.log
(3)日志输出格式
默认输出的格式如下:
示例:
# %d-时间格式、%thread-线程、%-5level-从左5字符宽度、%logger{50}-日志50个字符、%msg-信息、%n-换行# 修改在控制台输出的日志格式logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} -%msg%n# 修改输出到文件的日志格式logging.pattern.file=%d{yyyy/MM/dd} === [%thread] == %-5level == %logger{50} == %msg%n
对应符号的含义如下:
%d{HH:mm:ss.SSS}——日志输出时间%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用%-5level——日志级别,并且使用5个字符靠左对齐%logger- ——日志输出者的名字%msg——日志消息%n——平台的换行符
(4)logback-spring.xml的使用
logback.xml可以直接被日志框架识别。如果使用logback-spring.xml,日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot 的高级Profile功能。如果使用,直接将logback.xml或者logback-spring.xml在类路径下加入每个日志框架的配置文件即可。
1)在logback-spring.xml中加入配置
%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n %d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n
2)在application.properties文件中配置激活dev开发环境
spring.profiles.active=dev
关于logback.xml和logback-spring.xml的详细配置可参考一下博客:
发表评论
最新留言
关于作者
