11.springboot与日志
市场上的日志框架:
JUL,JCL,Jboss-logging,logback,log4j,log4j2,slf4j...
日志门面(日志的抽象层:相当于接口)
|
日志实现(接口的实现)
|
JCL(jakarta Commons loggging)
slf4j(simple logging facade for java)
jboss-logging
|
log4j
jul
lo4j2
logback
|
左边选择一个抽象层,右边选择一个实现!
日志门面选择:SLF4J
日志实现:LogBack
springBoot:底层是spring框架,spring框架默认使用的是JCL
springboot选用的是SLF4J和LogBack
2.SLF4J的使用
1.如何在系统中使用SLF4J的日志框架呢
以后在开发时,日志记录方法的调用,不应该直接调用日志的实现类,而是应该调用日志抽象层里面的方法
遗留问题
springboot(默认底层使用的是:slf4j和logback)
spring(默认底层使用的是comming-logging)
hibernate(默认底层使用的是 jboss-logging)
等等
那如何做到日志的统一呢??和springboot一样使用slf4j进行日志输出呢!
如何让系统中所有的日志都使用slf4j呢
做法:
1.将其他系统中的日志先排除出去
2.用中间包替换原有的日志框架
3.我们导入slf4j的实现
总结:
1》springboot底层也是使用slf4j和logback的方式进行日志记录
2》springboot也把其他的日志都替换成了slf4j
3》中间替换包?
4》如果我们要引入其他框架?一定要把这个框架的默认日志依赖移除掉,导入中间转换包,最终日志以slf4j和logback的形式进行统一
例如:spring框架用的是commons-logging的日志框架,springboot底层就是spring,他在导入spring依赖时:
日志的使用:
Logger logger = LoggerFactory.getLogger(getClass());--->这里的LoggerFactoryjar包必须是slf4j的
@Test
public void test0(){
/**
* 日志级别从低祷告: trace<debug<info<warm<erro
* 可以调整日志的输出级别:日志就只会在这个级别以后的高级别生效
*/
logger.trace("这是trace日志..");
logger.debug("这时debug日志...");
//springboot默认给我们使用的是info(info以及更高级别)级别的,没有指定级别的就是用springboot默认规定的级别:又称root级别
logger.info("这这是info日志...");
logger.warn("这是warm日志..");
logger.error("这是erro日志...");
}
输出:发现其只输出了info以及更高日志-->springboot的默认输出级别!
2020-09-20 11:35:15.530 INFO 11648 --- [ main] cn.com.wmd.SpringBootTest : 这这是info日志...
2020-09-20 11:35:15.530 WARN 11648 --- [ main] cn.com.wmd.SpringBootTest : 这是warm日志..
2020-09-20 11:35:15.538 ERROR 11648 --- [ main] cn.com.wmd.SpringBootTest : 这是erro日志...
这个默认的输出级别在application.properties可做更改:logging.level.包=日志级别---->意思是在包(cn)下的所有类使用的日志级别均是trace
logging.level.cn=trace
这时输出:发现其输出了全部级别的日志!!
2020-09-20 11:40:46.392 TRACE 14656 --- [ main] cn.com.wmd.SpringBootTest : 这是trace日志..
2020-09-20 11:40:46.392 DEBUG 14656 --- [ main] cn.com.wmd.SpringBootTest : 这时debug日志...
2020-09-20 11:40:46.392 INFO 14656 --- [ main] cn.com.wmd.SpringBootTest : 这这是info日志...
2020-09-20 11:40:46.392 WARN 14656 --- [ main] cn.com.wmd.SpringBootTest : 这是warm日志..
2020-09-20 11:40:46.398 ERROR 14656 --- [ main] cn.com.wmd.SpringBootTest : 这是erro日志...
logging.path和logging.file的区别
logging.file
|
logging.path
|
示例
|
描述
|
不指定
|
不指定
|
只在控制台输出
|
|
指定文件名
|
不指定
|
my.log
|
输出日志到my.log
|
不指定
|
指定目录
|
/var/log
|
输出到指定目录的spring.log文件中
|
使用示例:
在application.properties配置文件中配置:
#在当前磁盘的根目录下常见spring文件夹和里面的log文件夹;使用spring.log作为默认的配置文件
logging.path=/spring/log
#不指定路径会在当前项目下生成springboot.log日志
#可以指定完整的路径
logging.file=G:/springboot.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
日志的输出格式:
%d表示日期时间
%thread表示线程名
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名称做i长50个字符,否则按照句点分割
%msg:日志消息
%n是换行符
发现控制台输出格式:
2020-09-20 [main] TRACE cn.com.wmd.SpringBootTest - 这是trace日志..
2020-09-20 [main] DEBUG cn.com.wmd.SpringBootTest - 这时debug日志...
2020-09-20 [main] INFO cn.com.wmd.SpringBootTest - 这这是info日志...
2020-09-20 [main] WARN cn.com.wmd.SpringBootTest - 这是warm日志..
2020-09-20 [main] ERROR cn.com.wmd.SpringBootTest - 这是erro日志...
文件输出格式:
2020-09-20===[main]===TRACE===cn.com.wmd.SpringBootTest===这是trace日志..
2020-09-20===[main]===DEBUG===cn.com.wmd.SpringBootTest===这时debug日志...
2020-09-20===[main]===INFO ===cn.com.wmd.SpringBootTest===这这是info日志...
2020-09-20===[main]===WARN ===cn.com.wmd.SpringBootTest===这是warm日志..
2020-09-20===[main]===ERROR===cn.com.wmd.SpringBootTest===这是erro日志...
2.指定日志文件的配置
给类路径下放上每个日志框架自己的配置文件即可;springboot就不会使用自己的默认配置了
日志框架
|
配置文件名称
|
Logback
|
logback-spring.xml ,logback-spring.groovy, logback.xml, logback.groovy
|
log4j2
|
log4j2-spring.xml, log4j.xml
|
JDK(Java Util Logging)
|
logging.properties
|
logback.xml:直接被日志框架识别到了
logback-spring.xml:日志框架就不会直接加载日志的配置项,由spring-boot解析日志配置,可以使用springboot的告警profile共功能
<springProfile name="staging">
可以指定某段配置只在某个环境下生效
</springProfile>