转自:素文宅博客
地址:https://blog.yoodb.com/yoodb/article/detail/1573
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属性指定。
根据不同的日志系统,可以按如下规则组织配置文件名,就能被正确加载:
日志系统定制配置Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovyLog4jlog4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xmlLog4j2log4j2-spring.xml, log4j2.xmlJDK (Java Util Logging)logging.properties
注: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 EnvironmentSystem PropertyCommentslogging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD记录异常使用的关键字logging.fileLOG_FILE如果指定就会在默认的日志配置中使用logging.pathLOG_PATH如果指定就会在默认的日志配置中使用logging.pattern.consoleCONSOLE_LOG_PATTERN日志输出到控制台(stdout)时使用的模式(只支持默认的logback设置)logging.pattern.fileFILE_LOG_PATTERN日志输出到文件时使用的模式(如果LOG_FILE启用,只支持默认的logback设置)logging.pattern.levelLOG_LEVEL_PATTERN用来渲染日志级别的格式(默认%5p,只支持默认的logback设置)PIDPID当前的处理进程(process)ID(能够找到,且还没有用作OS环境变量)
注:日志系统在解析配置文件时所有支持获取系统属性的值,具体参考spring-boot.jar中的默认配置。
Logging格式
Spring Boot 默认日志输出如下:
2020-03-13 13:48:19.250 INFO 9632 --- [ main] c.y.s.d.SpringbootStudyDemo04Application : Starting SpringbootStudyDemo04Application on mrwang with PID 9632 (F:\project\study\springboot-study-demo04\target\classes started by afreo in F:\project\study) 2020-03-13 13:48:19.252 INFO 9632 --- [ main] c.y.s.d.SpringbootStudyDemo04Application : No active profile set, falling back to default profiles: default 2020-03-13 13:48:20.058 INFO 9632 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 2020-03-13 13:48:20.061 INFO 9632 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2020-03-13 13:48:20.093 INFO 9632 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 15ms. Found 0 Redis repository interfaces. 2020-03-13 13:48:20.345 INFO 9632 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'dataSourceConfig' of type [com.yoodb.study.demo04.datasource.DataSourceConfig$$EnhancerBySpringCGLIB$$c2cfe772] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2020-03-13 13:48:20.384 INFO 9632 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'dataSource' of type [com.zaxxer.hikari.HikariDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2020-03-13 13:48:20.833 INFO 9632 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'sqlSessionFactory' of type [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 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,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个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
3、新建HelloWorldController类文件,具体内容如下:
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; } }
注:在添加引用时,日志的包一定是org.slf4j.Logger、org.slf4j.LoggerFactory类。
4、启动项目后,进行测试
1)运行主程序
2)在浏览器中依次输入
http://localhost:8080/
http://localhost:8080/hello/yoodb
3)由于我的工程在D盘所有log日志文件所在的目录找到D:/workspace/log文件夹下,日志文件的名称是在配置文件logback-spring.xml中设置。
控制台输出日志:
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 2020-03-13 16:00:26.842 [http-nio-9090-exec-1] DEBUG c.y.s.demo04.HelloWorldController -访问 helloName,Name=yoodb 2020-03-13 16:03:10.953 [http-nio-9090-exec-4] DEBUG c.y.s.demo04.HelloWorldController -关注微信公众号“Java精选”,Spring Boot系列文章持续更新中,带你从入门到精通,玩转Spring Boot框架。
日志文件内容如下图所示:
本文“Spring Boot从入门到精通(七)集成Redis实现Session共享”文章的项目源码(springboot-study-demo04)地址:
https://github.com/yoodb/springboot
截止到这里关于Spring boot针对日志管理就讲完了,下面大家不妨试一试,但要注意使用的时候配置文件,有什么疑问欢迎下方留言,看到后小编立马回复!
Spring Boot从入门到精通(一)搭建第一个Spring Boot程序
Spring Boot从入门到精通(二)配置GitHub并上传Maven项目
Spring Boot从入门到精通(三)常用注解含义及用法分析总结
Spring Boot从入门到精通(四)连接MySQL数据库(附源码)
Spring Boot从入门到精通(五)多数据源配置实现及源码分析
Spring Boot从入门到精通(六)集成Redis实现缓存机制
Spring Boot从入门到精通(七)集成Redis实现Session共享
搞不定MyBatis面试,速看全面MyBatis面试题及答案整理总结