Spring Boot 对日志的处理, 与平时我们处理日志的方式完全一致, 它为 Java Util Logging,Log4J2 和 Logback 提供了默认配置. 对于每种日志都预先配置使用控制台输出和可选的文件输出功能.
如果使用 Spring Boot Starters, 那么默认使用的日志框架是 Logback.Spring Boot 底层对 Java Util Logging,Commons Logging,Log4J 及 SLF4J 日志框架也进行了适配, 只需相关配置就可以实现日志框架的相互切换.
为了便捷, 采用 "Spring Boot 从入门到精通 (七) 集成 Redis 实现 Session 共享" 一章节使用的工程,[此章节来源自 "Java 精选" 微信公众号, 切换至后台 ->聚合 ->开源项目, 分享了很多中间件比如 Sring Boot 系列文章从入门到精通等] , 讲述一下 Spring Boot 中如何实现日志管理和相关配置信息的分析.
自定义日志配置
通过将相应的库添加到 classpath 可以激活各种日志系统, 然后在 classpath 根目录下提供合适的配置文件可以进一步定制日志系统, 配置文件也可以通过 Spring Environment 的 logging.config 属性指定.
根据不同的日志系统, 可以按如下规则组织配置文件名, 就能被正确加载:
Spring Boot 官方推荐优先使用带有 - spring 的文件名作为定义的日志配置(使用 logback-spring.xml 而不是 logback.xml 名称), 若命名为 logback-spring.xml 的日志配置文件, Spring Boot 可以为它添加一些 Spring Boot 特有的配置项; 建议尽可能不使用 Java Util Logging 方式, 因为 Java Util Logging 从可执行 jar 运行时会导致一些已知的类加载问题.
Spring Envrionment 转换为 System properties, 一些有助于定制的配置属性和含义, 参考如下所示:
注: 日志系统在解析配置文件时所有支持获取系统属性的值, 具体参考 spring-boot.jar 中的默认配置.
Logging 格式说明
Spring Boot 默认日志输出如下:
- 2020-03-13 13:48:20.836 INFO 9632 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'bootUserMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
- 2020-03-13 13:48:20.868 INFO 9632 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
- 2020-03-13 13:48:21.173 INFO 9632 --- [ main] o.s.b.w.embedded.tomcat.TomcatwebServer : Tomcat initialized with port(s): 9090 (http)
上述输出的日志信息, 从左往右含义解释如下: 日期时间: 精确到毫秒日志级别: ERROR,WARN,INFO,DEBUG or TRACE 进程: id 分割符: 用于区分实际的日志记录线程名: 括在方括号中日志名字: 通常是源类名
日志信息说明
日志信息输出
首先, 在 Maven 项目中 pom.xml 文件增加 logging 包引用, 具体配置内容如下:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-logging</artifactId>
- </dependency>
方式一: 在控制台输出日志
日志级别从低到高依次:
TRACE <DEBUG < INFO< WARN < ERROR < FATAL
Logback 日志不提供 FATAL 级别, 它被映射到 ERROR 级别.
Spring Boot 只会输出比当前级别高的日志, 默认的日志级别是 INFO, 因此低于 INFO 级别的日志记录都不输出. 默认级别(INFO), 执行代码如下:
- package com.yoodb.study.demo04;
- import org.junit.Test;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.boot.test.context.SpringBootTest;
- @SpringBootTest
- public class LoggerTest {
- private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
- @Test
- public void test() {
- logger.trace("trace 级别的日志");
- logger.debug("debug 级别的日志");
- logger.info("info 级别的日志");
- logger.warn("warn 级别的日志");
- logger.error("error 级别的日志");
- }
- }
控制台输出结果如下:
Connected to the target VM, address: '127.0.0.1:55595', transport: 'socket'
14:05:13.957 [main] DEBUG com.yoodb.study.demo04.LoggerTest - debug 级别的日志
14:05:13.962 [main] INFO com.yoodb.study.demo04.LoggerTest - info 级别的日志
14:05:13.962 [main] WARN com.yoodb.study.demo04.LoggerTest - warn 级别的日志
14:05:13.962 [main] ERROR com.yoodb.study.demo04.LoggerTest - error 级别的日志
- Disconnected from the target VM, address: '127.0.0.1:55595', transport: 'socket'
- Process finished with exit code 0
Spring Boot 中默认配置 ERROR,WARN 和 INFO 级别的日志输出到控制台. 您还可以通过启动您的应用程序 - debug 标志来启用 "调试" 模式(开发时推荐开启), 以下两种方式皆可:
1)在运行命令后加入 - debug 标志, 例如:
$ java -jar springTest.jar --debug
2)在 application.properties 中配置 debug=true, 该属性置为 true 的时候, 核心 Logger(包含嵌入式容器, hibernate,spring)会输出更多内容, 但是你自己应用的日志并不会输出为 DEBUG 级别.
方式二: 以文件的形式输出日志
默认情况下, Spring Boot 将日志输出到控制台, 不会写到日志文件. 如果要编写除控制台输出之外的日志文件, 则需在 application.properties 中设置 logging.file.name 或 logging.file.path 属性.
1)logging.file.name, 设置文件, 可以是绝对路径, 也可以是相对路径. 例如:
logging.file.name=info.log
2)logging.file.path, 设置目录, 会在该目录下创建 spring.log 文件, 并写入日志内容, 例如:
logging.file.path=/workspace/log
如果只配置 logging.file.name, 会在项目的当前路径下生成一个 xxx.log 日志文件. 如果只配置 logging.file.path, 在 / workspace/log 文件夹生成一个为 spring.log 日志文件. 注: 二者不能同时使用, 如若同时使用, 则只有 logging.file.name 生效. 默认情况下, 日志文件的大小达到 10MB 时会切分一次, 产生新的日志文件, 默认级别为: ERROR,WARN,INFO. 所有支持的日志记录系统都可以在 Spring 环境中设置记录级别, 格式为:"logging.level.* = LEVEL".
logging.level 属性:
日志级别控制前缀,* 为包名或 Logger 名.
LEVEL 参数:
选项包括 TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF.
1, 虽然 Spring Boot 中 application.properties 配置文件提供了日志的配置, 但是个人更倾向于 logback.xml 的配置方式. 在 src/main/resources 目录中增加 logback-spring.xml 日志文件, 文件内容如下(配置相对简单, 个人请根据工程情况, 进行相应的配置):
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration scan="true" scanPeriod="10 seconds">
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <File>${LOG_PATH}/info.log</File>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${LOG_PATH}/info-%d{yyyyMMdd}.log.%i
- </fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>500MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>2</maxHistory>
- </rollingPolicy>
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
- </Pattern>
- </layout>
- </appender>
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>ERROR</level>
- </filter>
- <File>${LOG_PATH}/error.log</File>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${LOG_PATH}/error-%d{yyyyMMdd}.log.%i
- </fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>500MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <maxHistory>2</maxHistory>
- </rollingPolicy>
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
- </Pattern>
- </layout>
- </appender>
- <!-- 输出到控制台 ConsoleAppender-->
- <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
- <!-- 展示格式 layout-->
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
- </layout>
- </appender>
- <root level="INFO">
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="ERROR_FILE" />
- <appender-ref ref="CONSOLE_APPENDER" />
- </root>
- </configuration>
注: 1)控制台和日志文件的字符集; 2)日志文件的存放位置, 须要遵守 Linux 的命名规则. 根节点 < configuration > 包含的属性 scan: 当此属性设置为 true 时, 配置文件如果发生改变, 将会被重新加载, 默认值为 true.scanPeriod: 设置监测配置文件是否有修改的时间间隔, 如果没有给出时间单位, 默认单位是毫秒. 当 scan 为 true 时, 此属性生效. 默认的时间间隔为 1 分钟. debug: 当此属性设置为 true 时, 将打印出 logback 内部日志信息, 实时查看 logback 运行状态. 默认值为 false.1)子节点 < root>root 节点是必选节点, 用来指定最基础的日志输出级别, 只有一个 level 属性. level: 用来设置打印级别, 大小写无关, 其值包含如下:
TRACE,DEBUG,INFO,WARN,ERROR,ALL 和 OFF
level 不能设置为 INHERITED 或者同义词 NULL, 默认是 DEBUG.root 节点中可以包含零个或多个元素, 标识这个 appender 将会添加到这个 loger.
- <root level="INFO">
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="ERROR_FILE" />
- <appender-ref ref="CONSOLE_APPENDER" />
- </root>
2)子节点 < contextName > 设置上下文名称每个 logger 都关联到 logger 上下文, 默认上下文名称为 "default". 但可以使用设置成其他名字, 用于区分不同应用程序的记录. 设置后不能修改, 通过 %contextName 设置来打印日志上下文名称, 一般来说不用这个属性. 3)子节点 < appender>
appender 用来格式化日志输出节点, 有两个属性 name 和 class,class 用来指定哪种输出策略, 常用就是控制台输出策略和文件输出策略. 控制台输出使用 ConsoleAppender 类文件, 具体参考配置如下:
- <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
- <!-- 展示格式 layout-->
- <layout class="ch.qos.logback.classic.PatternLayout">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
- </layout>
- </appender>
2, 在 application.properties 中指定 logback-spring.xml 文件和日志生成的路径, 配置内容如下:
- #com.yoodb.study.demo04 包下所有 class 以 DEBUG 级别输出
- logging.level.com.yoodb.study=DEBUG
- # 用来指定自己创建的日志文件
- logging.config=classpath:logback-spring.xml
- # 指定输出文件位置
- logging.file.path=D://workspace/log
- package com.yoodb.study.demo04;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.Web.bind.annotation.PathVariable;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RestController;
- @RestController
- public class HelloWorldController {
- protected static Logger logger=LoggerFactory.getLogger(HelloWorldController.class);
- @RequestMapping("/")
- public String helloworld(){
- logger.debug("关注微信公众号"Java 精选 ",Spring Boot 系列文章持续更新中, 带你从入门到精通, 玩转 Spring Boot 框架.");
- return "Hello world!";
- }
- @RequestMapping("/hello/{name}")
- public String helloName(@PathVariable String name){
- logger.debug("访问 helloName,Name={}",name);
- return "Hello"+name;
- }
- }
- 2020-03-13 16:00:26.793 [http-nio-9090-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] -Initializing Spring DispatcherServlet 'dispatcherServlet'
- 2020-03-13 16:00:26.794 [http-nio-9090-exec-1] INFO o.s.Web.servlet.DispatcherServlet -Initializing Servlet 'dispatcherServlet'
- 2020-03-13 16:00:26.803 [http-nio-9090-exec-1] INFO o.s.Web.servlet.DispatcherServlet -Completed initialization in 9 ms
来源: https://www.cnblogs.com/MrYoodb/p/12493591.html