市面上的日志框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j...
日志门面(日志的抽象层) | 日志的实现层 |
---|---|
Log4j、Log4j2、JUL(java.util.logging)、Logback |
Spring Boot底层是Spring框架,而Spring框架模式使用的是JCL;
所以Spring Boot对日志框架进行了封装,选用 SLF4j 和 Logback作为日志框架。
2.1、如何在系统中使用SLF4j
注意点:以后在开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层的方法。
给项目中导入slf4j.jar和logback.jar。
使用slf4j进行日志记录。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
图示:SLF4j绑定到其他日志框架所需要的jar包
每一个日志的实现框架都有自己的配置文件。所以即使使用了slf4j以后,配置文件还是日志实现框架的配置文件。例如:sfl4j作为抽象层,log4j作为实现层,则需要使用log4j.properties或log4j.xml作为配置文件。
在一个大型的系统项目中,会运用到多种框架,比如Spring,Hibernate,Mybatis...,而每个框架的日志框架又不尽相同,既然如此,如何统一日志记录?下图来源于slf4j官网的图片,上面很好的解释了如何将其他日志框架统一到slf4j!!!
1、将系统中其他日志框架先排除出去;
2、用中间包替换原有的日志框架;
每一个Spring Boot应用都依赖于spring-boot-starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
而spring-boot-starter又依赖于spring-boot-starter-logging:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
所以Spring Boot的底层依赖关系:
1)、Spring Boot底层使用的是slf4j+logback的方式进行日志记录; 2)、Spring Boot也把其他的日志替换成了slf4j,并把Spring底层的commons-logging移除掉了:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
3)、同时Spring Boot导入中间替换包,替换包的包名其实跟原来的包名一样,做了进一步的封装,并在内部使用slf4j:
public abstract class LogFactory { //内部使用的是SLF4JLogFactory static LogFactory logFactory = new SLF4JLogFactory(); }
4.1、默认配置
Spring Boot默认已经配置好了日志,可以直接使用SLF4J里的LoggerFactory:
@RunWith(SpringRunner.class) @SpringBootTest public class SpringBoot03LoggingApplicationTests { //日志记录器 Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { //日志的级别: //由低到高:trace < debug < info < warn < error //可以调整输出的日志级别,日志就只会输出大于或等于当前设置的日志级别的所有日志信息 logger.trace("这是trace日志"); logger.debug("这是debug日志"); //Spring Boot默认的日志级别是info logger.info("这是info日志"); logger.warn("这是warn日志"); logger.error("这是error日志"); } }
通过在配置文件中设置日志级别:
# 设置默认的root级别,即Spring Boot默认的日志级别 logging.level.root=debug # 设置org.com.cay.spring.boot所在的包使用trace的日志级别,其他使用默认的 logging.level.org.com.cay.spring.boot=trace其他配置项:
# 在当前项目下生成springboot.log日志文件,也可以使用绝对路径 logging.file=springboot.log # 在当前磁盘的根路径下创建spring文件夹以及里面的log文件夹,并使用默认的spring.log作为日志文件名 logging.path=/spring/log/
logging.path | Example | Description | |
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 输出日志到my.log文件中 |
(none) | 指定目录 | /var/log | 输出日志到指定目录下的spring.log文件中 |
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
在类路径下放置当前系统中使用的日志框架的自定义配置文件即可,Spring Boot就不再使用默认的配置了。
Customization | |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
如果日志配置文件名为logback.xml,则会直接被日志框架所识别;
如果日志配置文件名为logback-spring.xml(推荐加上-spring),则日志框架不会直接加载日志的配置,而是由Spring Boot来解析日志配置,从而可以使用Spring Boot提供的高级Profile功能;
springProfile标签可以根据当前环境的profile来动态切换日志的配置项,而springProfile可以在logback的配置文件的configuration根标签下任何地方使用,多个profile使用逗号分隔开。
<configuration> <springProfile name="dev"> <!-- 当前是dev环境时使用如下配置 --> </springProfile> <springProfile name="!dev"> <!-- 当前不是dev环境时使用如下配置 --> </springProfile> <springProfile name="staging, prod"> <!-- 当前环境是staging或者prod时使用如下配置 --> </springProfile> </configuration>
可以按照slf4j的日志适配图,进行相关的切换。
举例:slf4j+logback切换成slf4j+log4j
先移除掉logback的依赖
然后移除log4j-over-slf4j的依赖
添加slf4j-log412的依赖
最后添加log4j.properties到resources目录下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency>
切换成spring-boot-starter-log4j2
移除spring-boot-starter-logging的依赖
添加spring-boot-starter-log4j2的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
====================打个广告,欢迎关注====================
QQ: |
412425870 |
微信公众号:Cay课堂 |
|
csdn博客: |
http://blog.csdn.net/caychen |
码云: |
https://gitee.com/caychen/ |
github: |
https://github.com/caychen |
点击群号或者扫描二维码即可加入QQ群: |
|
|