SpringBoot日志配置

SpringBoot日志配置

规范:项目开发不应该编写System.out.println()的语句,而应该日志记录信息。

日志门面技术 日志实现
JCL(Jakarta Commons Logging) Log4j、 JUL(java.util.logging)
SLF4j(Simple Logging Facade for Java) Log4j2、Logback
jboss-logging

简介

1、Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。

spring5及以后commons-logging被spring自动导入

2、支持jul, log4j2, logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。

3、logback是默认使用的

4、虽然日志框架很多,但我们可以使用SpringBoot的默认配置。

SpringBoot默认日志配置

1、每个starter场景,都会导入一个核心场景spring-boot-starter

2、核心场景引入了日志的所有功能spring-boot-starter-logging

3、默认使用了logback+slf4j组合作为默认底层日志。

4、日志是系统启动就要用,xxxAutoConfuration是系统启动好了以后放好的组件。

5、日志是通过监听器机制配置好的,ApplicationListener

6、日志所有的配置都可以通过修改配置文件实现。以logging开始的所有配置。

日志格式

默认输出格式

时间和日期:毫秒级精度

日志级别:ERROR、WARN、INFO、DEBUG、TRACE

进程ID

---:消息分割符

线程名:使用[]包含

Logger名:通常是产生日志的类别

消息:日志记录的内容

默认值可参照spring-bootadditional-spring-configuration-metadata.json文件。

注意:logback没有FATAL级别,对应的是ERROR,在控制台使用jps能够查看所有进程。

日志使用

方式一

java 复制代码
@RestController
public class HelloController {
    Logger logger = LoggerFactory.getLogger(HelloController.class);
    //Logger logger = LoggerFactory.getLogger(getClass())
    @GetMapping("/hello")
    public String hello(){
        logger.info("test log");
        return "hello";
    }
}


方式二

java 复制代码
@Slf4j
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        log.info("need lombok dependency");
        return "hello";
    }
}

日志级别

由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
只会打印指定级别及以上级别的日志

日志级别 含义
ALL 打印所有日志
TRACE 追踪框架详细流程日志,一般不使用
DEBUG 开发调试细节日志
INFO 关键、感兴趣信息日志
WARN 警告但不是错误的信息日志,比如:版本过时
ERROR 业务错误日志,比如出现各种异常
FATAL 致命错误日志,比如JVM系统崩溃
OFF 关闭所有日志记录

不指定级别的所有类,都使用root指定的级别作为默认级别,SpringBoot日志默认级别是INFO。

测试

java 复制代码
@Slf4j
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        log.trace("trace 日志.....");
        log.debug("debug 日志.....");
        log.info("info 日志.....");
        log.warn("warn 日志.....");
        log.error("error 日志.....");
        return "hello";
    }
}

由于SpringBoot默认的日志级别是INFO,所以只有INFO级别及更高级别的日志信息才会被输出到日志中,而TRACE、DEBUG级别的日志信息将被忽略。

日志配置

1、在application.properties/yml中配置logging.level.<logger-name>=<level>指定日志级别,logger-name可以是某一个类

2、level可取值范围:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF,定义在LogLevel中

3、root的logger-nameroot,可以配置logging.level.root=warn,代表所有未指定日志级别都使用root的warn级别

日志输出参数

java 复制代码
@Slf4j
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(String a, String b){
        log.info("info 日志.....参数a:{} b:{}",a, b);
        return "hello";
    }
}

日志分组

将相关的logger分组在一起,统一配置。如:Tomcat相关的日志统一设置。

SpringBoot预定义两个开箱即用的组

name Loggers
web org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.web.servlet.ServletContextInitializerBeans
sql org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

文件输出

SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.nameorlogging.path配置项。

logging.file.name logging.file.path 示例 效果
未指定 未指定 仅控制台输出
指定 未指定 my.log 写入指定文件。可以加路径
未指定 指定 /var/log 写入指定目录,文件名为spring.log
指定 指定 logging.file.name为准
properties 复制代码
#指定日志文件的路径,日志文件默认名叫spring.log
#logging.file.path=
#指定日志文件的名称
#1、只写名字、就生成当前项目相同位置的demo.log
#logging.file.name=demo.log
#2、写名字+路径:生成到指定位置的指定文件
logging.file.name=D://demo.log

当path配置项和name配置项同时存在的时候,以name为准。

文件归档与滚动切割

归档:每天的日志单独存到一个文档
切割:每个文件10MB,超过大小切割成另外一个文件。

1、每天的日志因该独立分割出来存档。如果使用logback(SpringBoot默认整合),可以通过application.properties/yml文件指定日志滚动规则。

2、如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)

3、支持的滚动规则设置如下

配置项 描述
logging.logback.rollingpolicy.file-name-pattern 日志存档的文件名格式(默认值:$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)
logging.logback.rollingpolicy.clean-history-on-start 应用启动时是否清除以前的存档(默认值:false)
logging.logback.rollingpolicy.max-file-size 存档前,每个日志文件的最大大小(默认值:10MB)
logging.logback.rollingpolicy.total-size-cap 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过1GB日志后就会删除旧日志文件
logging,logback.rollingpolicy.max-history 日志文件保存的最大天数(默认值:7)
properties 复制代码
logging.logback.rollingpolicy.file-name-pattern=$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)

自定义配置

通常我们配置application.properties就够平常使用,当然也可以自定义。如:

日志系统 自定义
Logback logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j2 log4j2-spring.xml,log4j2.xml
JDK(Java Util Logging) logging.properties

建议在日志配置文件中使用-spring变量,而不是xxx.xml,如果不加-springspring不能完全控制。

切换日志组合

使用maven的就近原则。

xml 复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>

最佳应用场景

1、导入热更新(Hot Reload)和第三方框架后,由于Spring Boot底层已经管理好了日志,因此需要排除这些框架的日志包。

2、修改application.properties配置文件,调整日志的所有行为。如果不够,可以编写日志框架,自己的配置文件放在类路径下就行,比如logback-spring.xml, log4j2-spring.xml

3、如果需要对接专业日志系统,只需要把logback记录的日志灌倒kafka中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可

4、业务中使用slf4j-api记录日志。不再需要System.out.pritln()

相关推荐
無限進步D4 小时前
Java 运行原理
java·开发语言·入门
難釋懷4 小时前
安装Canal
java
是苏浙4 小时前
JDK17新增特性
java·开发语言
不光头强4 小时前
spring cloud知识总结
后端·spring·spring cloud
GetcharZp7 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多7 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood7 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员8 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai