一起来学 SpringBoot 2.x | 第三篇:SpringBoot 日志配置

本文详细介绍SpringBoot的日志配置方法,包括日志格式、颜色编码、文件保存及自定义配置等内容。通过本文,读者可以了解如何配置日志级别、颜色、输出格式,并掌握如何利用springProfile和springProperty实现更灵活的日志配置。

点击上方“芋道源码”,选择“置顶公众号”

技术文章第一时间送达!

源码精品专栏

 

摘要: 原创出处 http://blog.battcn.com/2018/04/23/springboot/v2-config-logs/ 「唐亚峰」欢迎转载,保留摘要,谢谢!

  • 日志格式

  • 日志输出

  • 颜色编码

    • 编码对照表

  • 文件保存

  • 自定义日志配置

  • Logback扩展配置

    • springProfile

    • springProperty

  • 总结

  • 说点什么


SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程

Spring Boot 内部采用的是 Commons Logging进行日志记录,但在底层为 Java Util Logging、Log4J2、Logback 等日志框架提供了默认配置 。

Java 虽然有很多可用的日志框架,但请不要担心,一般来说,使用 SpringBoot 默认的 Logback 就可以了。

日志格式

SpringBoot 的默认输出的日志格式如下:

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

输出如下元素:

Logback 是没有 FATAL级别的日志,它将被映射到 ERROR

  • 时间日期:精确到毫秒,可以用于排序

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

  • 进程ID

  • 分隔符:采用 --- 来标识日志开始部分

  • 线程名:方括号括起来(可能会截断控制台输出)

  • Logger名:通常使用源代码的类名

  • 日志内容:我们输出的消息

日志输出

SpringBoot 默认为我们输出的日志级别为 INFOWARNERROR,如需要输出更多日志的时候,可以通过以下方式开启

  • 命令模式配置: java -jar app.jar --debug=true , 这种命令会被 SpringBoot 解析,且优先级最高

  • 资源文件配置: application.properties 配置 debug=true 即可。该配置只对 嵌入式容器、Spring、Hibernate生效,我们自己的项目想要输出 DEBUG 需要额外配置(配置规则:logging.level.=)

日志输出级别配置

logging.level.root = WARN
logging.level.org.springframework.web = DEBUG
logging.level.org.hibernate = ERROR

#比如 mybatis sql日志
logging.level.org.mybatis = INFO
logging.level.mapper所在的包 = DEBUG

日志输出格式配置

  • logging.pattern.console: 定义输出到控制台的格式(不支持JDK Logger)

  • logging.pattern.file: 定义输出到文件的格式(不支持JDK Logger)

颜色编码

如果终端支持 ANSI,默认情况下会给日志上个色,提高可读性,可以在配置文件中设置 spring.output.ansi.enabled 来改变默认值

  • ALWAYS: 启用 ANSI 颜色的输出。

  • DETECT: 尝试检测 ANSI 着色功能是否可用。

  • NEVER: 禁用 ANSI 颜色的输出。

编码对照表

LevelColor
WARNYellow
FATALERRORRed
INFODEBUGTRACEGreen

如果想修改日志默认色值,可以通过使用 %clr 关键字转换。比如想使文本变为黄色 %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}。目前支持的颜色有(bluecyanfaintgreenmagentaredyellow

文件保存

默认情况下,SpringBoot 仅将日志输出到控制台,不会写入到日志文件中去。如果除了控制台输出之外还想写日志文件,则需要在application.properties 设置logging.file 或 logging.path 属性。

  • logging.file: 将日志写入到指定的 文件 中,默认为相对路径,可以设置成绝对路径

  • logging.path: 将名为 spring.log 写入到指定的 文件夹 中,如(/var/log

日志文件在达到 10MB 时进行切割,产生一个新的日志文件(如:spring.1.log、spring.2.log),新的日志依旧输出到 spring.log 中去,默认情况下会记录 ERRORWARNINFO 级别消息。

  • logging.file.max-size: 限制日志文件大小

  • logging.file.max-history: 限制日志保留天数

自定义日志配置

由于日志在 ApplicationContext 之前就初始化好了,所以 SpringBoot 为我们提供了 logging.config 属性,方便我们配置自定义日志文件。默认情况它会根据日志的依赖自动加载。

Logging SystemCustomization
JDK (Java Util Logging)logging.properties
Log4j2ERRORlog4j2-spring.xml 或 log4j2.xml
Logbacklogback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy

Logback扩展配置

该扩展配置仅适用 logback-spring.xml 或者设置 logging.config 属性的文件,因为 logback.xml 加载过早,因此无法获取 SpringBoot的一些扩展属性

使用扩展属性 springProfile 与 springProperty 让你的 logback-spring.xml 配置显得更有逼格,当别人还在苦苦挣扎弄logback-{profile}.xml的时候 你一个文件就搞定了…

springProfile

<springProfile> 标签使我们让配置文件更加灵活,它可以选择性的包含或排除部分配置

<springProfile name="dev">
    <!-- 开发环境时激活 -->
</springProfile>

<springProfile name="dev,test">
    <!-- 开发,测试的时候激活-->
</springProfile>

<springProfile name="!prod">
    <!-- 当 "生产" 环境时,该配置不激活-->
</springProfile>

案例

<!-- 开发环境日志级别为DEBUG/并且开发环境不写日志文件 -->
<springProfile name="dev">
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
</springProfile>

<!-- 测试环境日志级别为INFO/并且记录日志文件 -->
<springProfile name="test">
    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>
</springProfile>

springProperty

<springProperty> 标签可以让我们在 Logback 中使用 Spring Environment 中的属性。如果想在logback-spring.xml中回读 application.properties 配置的值时,这是一个非常好的解决方案

<!-- 读取 spring.application.name 属性来生成日志文件名
    scope:作用域
    name:在 logback-spring.xml 使用的键
    source:application.properties 文件中的键
    defaultValue:默认值
 -->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="myapp.log"/>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/${logName}.log</file>
</appender>

总结

更多细节请参考官方文档:https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#boot-features-custom-log-configuration

目前很多大佬都写过关于 SpringBoot 的教程了,如有雷同,请多多包涵,本教程基于最新的 spring-boot-starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍…

666. 彩蛋




如果你对 Dubbo 感兴趣,欢迎加入我的知识星球一起交流。


知识星球

目前在知识星球(https://t.zsxq.com/2VbiaEu)更新了如下 Dubbo 源码解析如下:

01. 调试环境搭建
02. 项目结构一览
03. 配置 Configuration
04. 核心流程一览

05. 拓展机制 SPI

06. 线程池

07. 服务暴露 Export

08. 服务引用 Refer

09. 注册中心 Registry

10. 动态编译 Compile

11. 动态代理 Proxy

12. 服务调用 Invoke

13. 调用特性 

14. 过滤器 Filter

15. NIO 服务器

16. P2P 服务器

17. HTTP 服务器

18. 序列化 Serialization

19. 集群容错 Cluster

20. 优雅停机

21. 日志适配

22. 状态检查

23. 监控中心 Monitor

24. 管理中心 Admin

25. 运维命令 QOS

26. 链路追踪 Tracing

...
一共 60 篇++

<think>好的,我现在要解决用户的问题:在Spring Boot 3.x中无法访问javax.servlet.Filter类的问题。用户提到错误是找不到这个类,可能还涉及DispatcherServlet的问题。我需要根据提供的引用资料来整理解决方案。 首先,根据引用[3]和[5],Spring Boot 3.x版本开始使用Jakarta EE的包名,即jakarta.servlet,而不是原来的javax.servlet。所以用户如果还在代码中导入javax.servlet.Filter,就会找不到类。这时候需要将导入的包路径改为jakarta.servlet.*,比如import jakarta.servlet.Filter;。 接下来,检查pom.xml依赖是否正确。引用[4]提到需要引入spring-boot-starter-web,这个依赖可能没有被正确添加。但如果是Spring Boot 3.x的话,可能已经包含这个了,不过还是需要确认。另外,如果项目中使用了旧的库或第三方依赖(比如Swagger),可能会依赖javax的包,这时候需要升级这些依赖到支持Jakarta的版本。例如引用[5]中提到Swagger在Spring Boot 3.x下有问题,需要更换为SpringDoc OpenAPI。 然后是配置类的问题,引用[2]提到在启动类上添加@ServletComponentScan注解,这样可以扫描到自定义的Filter。如果用户没有添加这个注解,可能导致Filter未被注册。所以需要确保启动类有该注解。 另外,代码中的Filter实现是否正确。用户需要检查自定义的Filter类是否实现了jakarta.servlet.Filter接口,并且使用了正确的注解,比如@WebFilter或者通过配置类注册。例如,使用@WebFilter时,需要确保包导入正确,并且启动类有@ServletComponentScan。 还有一个可能性是Maven依赖冲突或未正确引入相关模块。需要检查是否引入了spring-boot-starter-web,或者是否有其他依赖覆盖了Jakarta的包。有时候可能需要排除旧的javax.servlet的依赖。 总结步骤应该是:1. 替换所有javax.servlet为jakarta.servlet;2. 检查并更新依赖,特别是第三方库;3. 添加@ServletComponentScan注解;4. 确保spring-boot-starter-web存在;5. 使用SpringDoc代替Swagger(如果相关)。 用户可能的问题还包括如何迁移旧项目到Spring Boot 3.x,如何处理多个依赖冲突,或者具体如何修改Filter的代码示例。因此,生成的问题可以围绕这些方面。</think>在Spring Boot 3.x中解决`javax.servlet.Filter`类找不到的问题,需遵循以下步骤: --- ### 一、根本原因分析 Spring Boot 3.x版本已**全面迁移至Jakarta EE 9+**,包路径从`javax.servlet`改为`jakarta.servlet`,直接使用旧包路径会导致类找不到错误[^3][^5]。 --- ### 二、具体解决方案 #### 1. 修改代码包路径 将代码中所有`javax.servlet`引用替换为`jakarta.servlet`: ```java // 修改前 import javax.servlet.Filter; // 修改后 import jakarta.servlet.Filter; ``` 同时修改相关注解路径,例如`@WebFilter`: ```java import jakarta.servlet.annotation.WebFilter; ``` #### 2. 添加必要依赖 在`pom.xml`中确认已包含Spring Boot Web组件: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` #### 3. 注册过滤器 **方式一:注解扫描** 在启动类添加`@ServletComponentScan`以识别`@WebFilter`注解的过滤器[^2]: ```java @ServletComponentScan @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` **方式二:Bean注册** 通过配置类显式注册Filter: ```java @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter> myFilter() { FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new MyFilter()); bean.addUrlPatterns("/*"); return bean; } } ``` #### 4. 兼容性处理(第三方依赖) 若使用**Swagger**等依赖`javax.servlet`的组件,需替换为兼容Jakarta的版本: ```xml <!-- 替代springfox-swagger --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.1.0</version> </dependency> ``` --- ### 三、验证流程 1. 清理Maven本地仓库并重新编译:`mvn clean install` 2. 检查控制台是否仍有类找不到错误 3. 通过断点或日志验证过滤器执行流程 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值