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()

相关推荐
激流丶12 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue15 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式32 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画38 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
假装我不帅1 小时前
asp.net framework从webform开始创建mvc项目
后端·asp.net·mvc
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
神仙别闹1 小时前
基于ASP.NET+SQL Server实现简单小说网站(包括PC版本和移动版本)
后端·asp.net
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc