窥探-spring boot日志使用及其源码分析


Spring Boot使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。 提供了Java Util Logging,Log4J2和Logback的默认配置。 在每种情况下,记录器都被预先配置为使用控制台输出以及可选文件输出。默认情况下,如果使用“Starts”,则使用Logback进行记录。 还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的从属库都能正常工作

日志排版

我们来看看spring的启动日志,看看日志是怎么排版的?

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.1.RELEASE)

2020-08-14 16:23:39.328  INFO 8124 --- [           main] org.tony.soringboot.logging.Application  : Starting Application on tony with PID 8124 (D:\sources\spring-boot-cloud-study-gradle\spring-boot-study-gradle-log-default\bin\main started by xuanyi in D:\sources\spring-boot-cloud-study-gradle)
2020-08-14 16:23:39.334  INFO 8124 --- [           main] org.tony.soringboot.logging.Application  : No active profile set, falling back to default profiles: default
2020-08-14 16:23:42.723  INFO 8124 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2020-08-14 16:23:42.744  INFO 8124 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-14 16:23:42.745  INFO 8124 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.36]
2020-08-14 16:23:43.121  INFO 8124 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-14 16:23:43.123  INFO 8124 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3670 ms
2020-08-14 16:23:43.520  INFO 8124 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-08-14 16:23:44.290  INFO 8124 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8081 (http) with context path ''
2020-08-14 16:23:44.600  INFO 8124 --- [           main] org.tony.soringboot.logging.Application  : Started Application in 6.305 seconds (JVM running for 7.56)

最上面的为spring的启动banner

//[日志时间][日志级别][进程id][---分隔符][执行线程][日志作用的相关类][日志信息message]
2020-08-14 16:23:44.600  INFO 8124 --- [           main] org.tony.soringboot.logging.Application  : Started Application in 6.305 seconds (JVM running for 7.56)

Logback没有FATAL级别,FATAL被映射到了ERROR级别

控制台输出

控制台输出是默认的日志配置,默认显示的级别为ERROR,WARN,INFO的日志级别。我们也可以使用–debug标记输出debug的日志,也可以在application.yml添加debug的标记
–debug:

java -jar spring-boot-study-gradle-log-default.jar --debug

appllication.yml:
在这里插入图片描述
启动项目,将显示debug的日志:
在这里插入图片描述

文件输出

spring boot默认是将日志进行控制台输出,没有将日志输出到文件,这样就不能进行日志追踪了。如果想将文件日志写入到指定的文件中,可以修改application.yml文件。添加logging.file和logging.path属性。
在这里插入图片描述
日志文件达到10 MB时会旋转,并且与控制台输出一样,默认情况下会记录ERROR级别,WARN级别和INFO级别的消息。 可以使用logging.file.max-size属性更改大小限制。 除非已设置logging.file.max-history属性,否则以前旋转的文件将无限期存档
日志记录系统在应用程序生命周期的早期进行了初始化。 因此,在通过@PropertySource批注加载的属性文件中找不到日志记录属性。日志记录属性与实际的日志记录基础结构无关。 结果,特定的配置密钥(例如用于logback的logback.configurationFile)不受spring boot 管理

日志级别

在springboot环境中,日志系统能有相关的日志级别,我们可以修改application.yml进行相关包的配置日志界别。配置root logger可以使用logging.level.root
在这里插入图片描述

客户自定义日志

通过在类路径中包含适当的库,可以激活各种日志记录系统并且可以通过在类路径的根目录或以下Spring Environment属性logging.config指定的位置中提供合适的配置文件来进一步自定义
可以通过使用org.springframework.boot.logging.LoggingSystem系统属性来强制Spring Boot使用特定的日志记录系统。 该值应该是LoggingSystem实现的完全限定的类名。还可以禁用Spring Boot的日志配置完全通过使用none值.
由于日志记录是在创建ApplicationContext之前初始化的,因此无法从Spring @Configuration文件中的@PropertySources控制日志记录。更改日志记录系统或完全禁用它的唯一方法是通过系统属性

日志系统自定义
Logbacklogback-spring.xml, logbackspring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging)logging.properties

如果可能,建议在日志配置中使用-spring变体(例如,logback-spring.xml而不是logback.xml)。 如果使用标准配置位置,Spring将无法完全控制日志初始化。
从“可执行jar”运行时,Java Util Logging存在一些已知的类加载问题,这些问题会引起问题。 如果可以的话,建议从“可执行jar”运行时避免使用它。
相关系统属性:

属性系统属性描述
logging.exception-conversion-wordLOG_EXCEPTION_CONVERSION_WORD日志记录异常时使用的转换词
logging.fileLOG_FILE如果定义,则在默认日志配置中使用
logging.file.max-sizeLOG_FILE_MAX_SIZE最大日志文件大小(如果启用LOG_FILE)。(只支持默认的Logback设置。 )
logging.file.max-historyLOG_FILE_MAX_HISTORY保存的归档日志文件的最大数量(如果启用LOG_FILE)。(只支持默认的Logback设置。)
logging.pathLOG_PATH如果定义,则在默认日志配置中使用
logging.pattern.consoleCONSOLE_LOG_PATTERN要在控制台(stdout)上使用的日志模式)。(只支持默认的Logback设置。)
logging.pattern.dateformatLOG_DATEFORMAT_PATTERN日志日期格式的附加模式。(只支持默认的Logback设置。)
logging.pattern.fileFILE_LOG_PATTERN要在文件中使用的日志模式(如果启用了LOG_FILE)。(只支持默认的Logback设置。)
logging.pattern.levelLOG_LEVEL_PATTERN呈现日志级别时要使用的格式(默认%5p)。(只支持默认的Logback设置。)
PIDPID当前进程ID(如果可能,在尚未定义为OS环境变量时发现)

如果要在日志记录属性中使用占位符,则应该使用SpringBoot的语法,而不是底层框架的语法。 值得注意的是,如果使用Logback,则应该使用:作为分隔符在 属性名称与其默认值之间,而不使用:-
可以通过只重写LOG_LEVEL_PATTERN(或用Logback logging.pattern.level)将MDC和其他临时内容添加到日志行中)。 例如,如果使用logging.pattern.level=user:%X{user} %5p 然后,默认日志格式包含“user”的MDC条目

Logback 扩展

Spring Boot包括Logback的许多扩展,可以帮助高级配置。可以在logback-spring.xml配置文件中使用这些扩展名。

Profile指定配置

通过< springProfile >标签,可以根据活动的Spring profile文件有选择地包括或排除配置部分。在< configuration >元素内的任何位置都支持profile文件部分。使用name属性指定哪个配置文件接受配置。可以使用逗号分隔的列表指定多个配置文件。

<springProfile name="test">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev, pro">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!pro">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

环境属性

< springProperty >标签使可以从Spring Environment中公开属性,以在Logback中使用。 如果要从Logback配置中访问application.properties文件中的值,则这样做很有用。该标签的工作方式类似于Logback的标准< property >标签。 但是,您没有指定直接值,而是指定了属性的来源(来自环境)。 如果需要将属性存储在本地范围以外的其他位置,则可以使用scope属性。如果需要回退值(如果未在环境中设置该属性),则可以使用defaultValue属性。

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
 defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}</remoteHost>
 ...
</appender>

日志加载分析

在spring boot的进行配置的时候,日志会在application运行之前就进行加载,我们还是从run方法进去一步一步进行查看。
我们通过启动日志看看日志的加载:
在这里插入图片描述
进入标红的相关方法看看:
调用日志启动信息,子类可以重载该方法进行添加而外的日志配置
在这里插入图片描述
StartupInfoLogger该类将打印启动的日志,进行相关的字符串追加进行打印
在这里插入图片描述
这个类使用了LogFactory.getLog进行加载logger,LogFactory是一个抽象类,这个类在该spring boot中的版本中子类是过期的状态
在这里插入图片描述
在该版本版本中使用LogAdapter.createLog进行使用和加载log的相关类。
LogAdapter:进行logger的适配器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值