SpringBoot日志
日志框架分类和选择
在开发中, 总会将关键数据用System.out.println();打印在控制台上,来进行检查判断,
日志框架就是用来打印这个得,用来在控制台上或者新建个文档来储存显示 系统运行时信息
日志框架分为抽象层 和实现层,
在市场上有很多日志框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....
日志门面 (日志的抽象层) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
SpringBoot:底层是Spring框架,Spring框架默认是用JCL;‘
==SpringBoot选用 SLF4j和logback;==
SLF4j 的使用
以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,
而是调用日志抽象层里面的方法;
给系统里面导入slf4j 的jar和 logback的实现jar
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 以及 实现层框架 logback 框架
需要导入 slf4j-api.jar
logback-classic.jar
logback-core.jar 因为这两个框架是一个人写的所有中间不需要连接包
而导入 slf4j 和 log4j 除了基础jar 包 外,还要导入一个 slf4j-log412.jar 的连接包
虽然这两个框架也是一个人写的 但 log4j 写出来的更早 没有考虑到后来的抽象层框架,所有需要连接
遗留问题
不同的框架使用的日志文件是不一定相同的,几个框架联合使用时我们需要统一框架,
所有我们再框架统一的时候需要导入其他框架,联合到我们需要使用的框架上,来使用;
如下图,SpringBoot中我们使用的是 slf4j ,所有我们在联合其他日志框架的时候 ,我们需要将
其他日志框架删除看,导入如: log4j-over-slf4j .jar 这类框架,来讲这些框架的功能转移到slf4j上
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现
SpringBoot日志关系
SpringBoot使用它来做日志功能;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
在IDEA中 在 pom.xml文件中 右键--> Diagrams -->show Dependencies 图表显示mavn 继承关系
总结:
1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录
2)、SpringBoot也把其他的日志都替换成了slf4j;
3)、中间替换包?(打开mavn下载的包 找到那些中间替换包,你会发现中间替换包中的java文件与原日志框架相同,
但其中的代码块换成了SLF4j 的)
@SuppressWarnings("rawtypes") public abstract class LogFactory {
static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
static LogFactory logFactory = new SLF4JLogFactory();
4)、如果我们要引入其他框架?一定要把这个框架的默认日志依赖移除掉?
如: 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>
日志使用
在SpringBoot 默认配置好的日志框架
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//System.out.println();
//日志的级别;
//由低到高 trace<debug<info<warn<error
//可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
logger.trace("这是trace日志...");
logger.debug("这是debug日志...");
//SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别
logger.info("这是info日志...");
logger.warn("这是warn日志...");
logger.error("这是error日志...");
}
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
SpringBoot修改日志的默认配置
在application.properties 中
#logging.path=
// 不指定路径在当前项目下生成springboot.log日志
//可以指定完整的路径;
#logging.file=G:/springboot.log
// 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
// 在控制台输出的日志的格式
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