博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot_03 日志
阅读量:3967 次
发布时间:2019-05-24

本文共 4062 字,大约阅读时间需要 13 分钟。

SpringBoot与日志


本人是个新手,写下博客用于自我复习、自我总结。

如有错误之处,请各位大佬指出。
学习资料来源于:尚硅谷


日志框架

在开发一个大型系统时,判断部分代码写的是否正确,可能会选择System.out.println(" “); 来将关键数据打印在控制台上。但在最后系统完成时,可能不需要输出,也就是说需要把之前的System.out.println(” ")全部删掉,或者需要把这些写在一个独立的文件中,以便管理和监控系统在运行时的一些信息,这时就会出现麻烦的情况。即:把之前所有的输出删去,或者把之前所有的输出移动到一个文件中。所以,应该在开发系统时,考虑使用日志框架来记录数据,避免在系统完成时带来的一系列麻烦。同样的,使用日志框架也可以为我们带来更多的功能。可以写一个统一的接口层:日志门面(日志的一个抽象层),再给项目中导入具体的日志实现就行了。

市面上常用的日志框架:

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j …

介绍如下:

日志门面(日志的抽象层) 日志实现
JCL 、SLF4j、jboss-logging Log4j、JUL 、Log4j2 、Logback

即选一个门面(抽象层)和一个实现方式。

常用的为:
日志门面:SLF4j
日志实现:Logback

而SpringBoot底层是Spring框架,Spring框架默认是用JCL;但SpringBoot选用SLF4j和logback;

SLF4j的使用

如何在系统中使用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 和 logback的实现jar。

在这里插入图片描述
(slf4j官网提供的使用图片)
深蓝色为实现层,墨绿色为适配层,适配那些不认识slf4j的日志实现。

每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件。

一些问题

比如 我使用slf4j+logback的实现方式,但是Spring框架使用JCL、Hibernate框架使用jboss-logging…

如果放在一起,那么该如何做到统一呢?

slf4j官网提供了办法:

在这里插入图片描述
方法就是:
1、将系统中其他的日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现。

SpringBoot日志关系

在这里插入图片描述

通过查看图表可以发现SpringBoot中日志的关系。
其中logback-core:使用logback记录日志;
log4j-to-slf4j、jul-to-slf4j 就是上面说的,让其他日志转为slf4j;
slf4j-api:导入了日志抽象层slf4j。

也就是说:SpringBoot的底层也是使用slf4j+logback的方式进行日志记录。同时,SpringBoot也允许把其他的日志替换成slf4j。如果,我们要引入其他框架,就一定要把这个框架的默认日志依赖移除掉。

就比如SpringBoot内部移除了Spring的默认日志依赖:

org.springframework
spring-core
commons-logging
commons-logging

日志使用

默认配置

当我们按照SpringBoot_01文章,自动建立了一个SpringBoot工程后,直接执行,就会发现,SpringBoot默认帮我们配置好了日志,当然也就可以手动调整:

我的Test文件:

package com.guigu.springboot;import org.junit.jupiter.api.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass SpringBoot03LoggingApplicationTests {
//记录器(用这个来记录日志) Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() {
//日志的级别: //由低到高 trace debug info warn error //可以调整需要输出的日志级别;日志就只会在这个级别及以后的高级别生效 logger.trace("这是trace日志..."); logger.debug("这是debug日志..."); //SpringBoot默认给我们使用的是info级别,即输出的是info级别及以上的 logger.info("这是info日志..."); logger.warn("这是warn日志..."); logger.error("这是error日志..."); }}

这其中就用到了记录器,以及一些用法。SpringBoot默认给我们使用的是info级别,即输出之后,只会看到info级别及以上的,当然也可以修改:

application.properties中:

logging.level.com.guigu=trace

即:logging.level.包名=级别

这样就可以指定级别,在输出的时候就可以看到指定级别及以上的日志信息。

还可以调整很多东西

application.properties中:

#当前项目下,生成指定名字的日志logging.file=springboot.log

之后就可以发现,在项目目录下,增加了一个springboot.log文件,记录了日志信息。当然也可以对它存放到指定位置:

#指定存放位置:logging.file=D:/springboot.log

一般情况下,使用logging.path。如果logging.path和logging.file同时使用,则logging.file起作用。

#在当前磁盘的根路径下,创建spring文件夹和里面的log文件夹。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

日志输出格式:

%d:表示日期时间
%thread:表示线程名
%-5level:级别从左显示5个字符宽度
%logger{50}:表示logger名字最长50个字符,否则按照句点分割
%msg:日志信息
%n:换行符

指定配置

在类路径下,放上每个日志框架自己的配置文件即可;SpringBoot就不使用它默认配置的了。

Logging System Customization
Logback logback-spring.xml,logback-spring.grooy,logback.xml,logback.groovy
Log4j2 log4j2-spring.xml,log4j2.xml
JDK logging.properties

logback.xml:直接被日志框架识别;

logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,同时可以使用SpringBoot的高级Profile功能:

可以指定某段配置只在某个环境下生效

(即,只要经过了SpringBoot的解析,就可以使用SpringBoot特有的其他功能。所以显然logback.xml就不可以使用这种方法)

激活某个环境,就和SpringBoot_02文章中一样,在application.properties中,调用语句。

在使用的时候,最好使用logback-spring.xml,log4j2-spring.xml 等,经过SpringBoot解析的文件格式,这样就可以实现更多高大上的功能。

每个日志文件的格式就不过多赘述,百度即可。

转载地址:http://cayki.baihongyu.com/

你可能感兴趣的文章
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
Mule ESB-Content-Based Routing Tutorial(1)
查看>>
Mule ESB-Content-Based Routing Tutorial(2)
查看>>
Mule ESB-Content-Based Routing Tutorial(3)
查看>>
年末项目经验总结
查看>>
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
写博意味着什么
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>