1.spring boot日志概述

spring boot使用Commons Logging作为内部的日志系统,并且给Java Util Logging,Log4J2以及Logback都提供了默认的配置。
如果使用了spring boot的Starters,那么默认会使用Logback用于记录日志。

2.spring boot日志默认配置

我们启动一个空的spring-boot项目看一下控制台的日志

控制台的默认配置

logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

其中%clr为配置不同的颜色输出,支持的颜色有以下几种:

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

输出顺序分析:

1、日期和时间--精确到毫秒,并按照时间进行简单的排序,格式为:

%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}

2、日志级别--ERROR,WARN,INFO,DEBUG,TRACE

%clr(${LOG_LEVEL_PATTERN:-%5p})

3、进程ID号

%clr(${PID:- })

4、日志内容,用"---"分隔符分开

%clr(---){faint}

5、线程名字--括在方括号中

  

%clr([%15.15t]){faint}

6、日志的名字--通常对应的是类名

  

%clr(%-40.40logger{39}){cyan}

注意:Logback没有FATAL级别(映射到ERROR)

不同日志级别对应的颜色如下

3.spring boot日志配置

可以通过application.properties或者application.yml查看所有配置

每个配置后面都有说明,就不一一赘述了。

4.spring boot日志实现原理

点击配置属性,可以进入LoggingApplicationListener这个类,

/*** An {@link ApplicationListener} that configures the {@link LoggingSystem}. If the* environment contains a {@code logging.config} property it will be used to bootstrap the* logging system, otherwise a default configuration is used. Regardless, logging levels* will be customized if the environment contains {@code logging.level.*} entries and* logging groups can be defined with {@code logging.group}.* <p>* Debug and trace logging for Spring, Tomcat, Jetty and Hibernate will be enabled when* the environment contains {@code debug} or {@code trace} properties that aren't set to* {@code "false"} (i.e. if you start your application using* {@literal java -jar myapp.jar [--debug | --trace]}). If you prefer to ignore these* properties you can set {@link #setParseArgs(boolean) parseArgs} to {@code false}.* <p>* By default, log output is only written to the console. If a log file is required the* {@code logging.path} and {@code logging.file} properties can be used.* <p>* Some system properties may be set as side effects, and these can be useful if the* logging configuration supports placeholders (i.e. log4j or logback):* <ul>* <li>{@code LOG_FILE} is set to the value of path of the log file that should be written* (if any).</li>* <li>{@code PID} is set to the value of the current process ID if it can be determined.* </li>* </ul>** @author Dave Syer* @author Phillip Webb* @author Andy Wilkinson* @author Madhura Bhave* @since 2.0.0* @see LoggingSystem#get(ClassLoader)*/

它实现了GenericApplicationListener接口,它默认定义了日志组DEFAULT_GROUP_LOGGERS和日志级别LOG_LEVEL_LOGGERS

private static final Map<String, List<String>> DEFAULT_GROUP_LOGGERS;static {MultiValueMap<String, String> loggers = new LinkedMultiValueMap<>();loggers.add("web", "org.springframework.core.codec");loggers.add("web", "org.springframework.http");loggers.add("web", "org.springframework.web");loggers.add("web", "org.springframework.boot.actuate.endpoint.web");loggers.add("web","org.springframework.boot.web.servlet.ServletContextInitializerBeans");loggers.add("sql", "org.springframework.jdbc.core");loggers.add("sql", "org.hibernate.SQL");DEFAULT_GROUP_LOGGERS = Collections.unmodifiableMap(loggers);}private static final Map<LogLevel, List<String>> LOG_LEVEL_LOGGERS;static {MultiValueMap<LogLevel, String> loggers = new LinkedMultiValueMap<>();loggers.add(LogLevel.DEBUG, "sql");loggers.add(LogLevel.DEBUG, "web");loggers.add(LogLevel.DEBUG, "org.springframework.boot");loggers.add(LogLevel.TRACE, "org.springframework");loggers.add(LogLevel.TRACE, "org.apache.tomcat");loggers.add(LogLevel.TRACE, "org.apache.catalina");loggers.add(LogLevel.TRACE, "org.eclipse.jetty");loggers.add(LogLevel.TRACE, "org.hibernate.tool.hbm2ddl");LOG_LEVEL_LOGGERS = Collections.unmodifiableMap(loggers);}

你也可以自定义logging.level和logging.group,它们都是map结构。LoggingApplicationListener重写了onApplicationEvent方法,实现日志的打印

    @Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event); //1}else if (event instanceof ApplicationEnvironmentPreparedEvent) {
            onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event); //2 }else if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent((ApplicationPreparedEvent) event); //3}else if (event instanceof ContextClosedEvent && ((ContextClosedEvent) event).getApplicationContext().getParent() == null) {onContextClosedEvent();  //4}else if (event instanceof ApplicationFailedEvent) {onApplicationFailedEvent();  //5}}

第一步:根据classloader里加载的依赖决定使用哪个日志系统?

主要实现有JavaLoggingSystem,Log4J2LoggingSystem,LogbackLoggingSystem

    private void onApplicationStartingEvent(ApplicationStartingEvent event) {this.loggingSystem = LoggingSystem.get(event.getSpringApplication().getClassLoader());this.loggingSystem.beforeInitialize();}

第二步:通过classpath,enviroment等获取参数初始化日志系统

    /*** Initialize the logging system according to preferences expressed through the* {@link Environment} and the classpath.* @param environment the environment* @param classLoader the classloader*/protected void initialize(ConfigurableEnvironment environment,ClassLoader classLoader) {new LoggingSystemProperties(environment).apply();LogFile logFile = LogFile.get(environment);if (logFile != null) {logFile.applyToSystemProperties();}initializeEarlyLoggingLevel(environment);initializeSystem(environment, this.loggingSystem, logFile);initializeFinalLoggingLevels(environment, this.loggingSystem);registerShutdownHookIfNecessary(environment, this.loggingSystem);}

第三步:注册springBootLoggingSystem

    private void onApplicationPreparedEvent(ApplicationPreparedEvent event) {ConfigurableListableBeanFactory beanFactory = event.getApplicationContext().getBeanFactory();if (!beanFactory.containsBean(LOGGING_SYSTEM_BEAN_NAME)) {beanFactory.registerSingleton(LOGGING_SYSTEM_BEAN_NAME, this.loggingSystem);}}

第四步和第五步:日志系统清洗

    private void onContextClosedEvent() {if (this.loggingSystem != null) {this.loggingSystem.cleanUp();}}private void onApplicationFailedEvent() {if (this.loggingSystem != null) {this.loggingSystem.cleanUp();}}

5.自定义配置文件

日志系统 自定义配置文件

Logback

logback-spring.xmllogback-spring.groovylogback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

6.总结

  spring boot日志系统封装了logback,log4j2和java log,默认情况下使用java log,一旦使用各种starts,则默认使用Log4J2,也可以通过classpath来改变,pom.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-log4j</artifactId>
</dependency> 

参考资料

【1】https://docs.spring.io/spring-boot/docs/2.1.2.RELEASE/reference/htmlsingle/#boot-features-logging-format

【2】https://www.jb51.net/article/133795.htm

转载于:https://www.cnblogs.com/davidwang456/p/10997038.html

让你的spring-boot应用日志随心所欲--spring boot日志深入分析相关推荐

  1. spring boot logback_SpringBoot集成logback后访问日志端点

    问题描述 使用SpringBootAdmin(sba)监控Springboot服务时,配置了logback日志框架,按天滚动生成日志,此时在sba的日志监控页面出现404,如下图所示: 解决方案 查看 ...

  2. Spring Boot + MDC 实现全链路调用日志跟踪

    写在前面 通过本文将了解到什么是MDC.MDC应用中存在的问题.如何解决存在的问题 MDC介绍 简介: MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j .l ...

  3. Spring Boot——基于AOP的HTTP操作日志解决方案

    解决方案 package com.hailiu.web.aop;import com.fasterxml.jackson.databind.ObjectMapper; import com.haili ...

  4. 学习Spring Boot:(四)应用日志

    前言 应用日志是一个系统非常重要的一部分,后来不管是开发还是线上,日志都起到至关重要的作用.这次使用的是 Logback 日志框架. 正文 Spring Boot在所有内部日志中使用Commons L ...

  5. Spring Boot中自动配置原理以及日志的基本使用

    目录 自动配置原理 日志的基本使用 自动配置原理 自动配置原理: 1. Spring Boot启动时加载主配置类,开启了知道配置功能@EnableAutoConfiguration. 2. @Enab ...

  6. Spring Boot:(六)默认日志logback配置解析

    Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...

  7. spring boot日志配置文件(彩色日志)logback-spring.xml

    文章目录 前言 ✨彩色日志 ✨输出到控制台 ✨输出到文件 1.输出所有日志 2.输出错误日志 ✨配置不同环境下的日志级别 ✨完整的logback-spring.xml文件配置 ✨文件下载 前言 spr ...

  8. PlumeLog分布式日志系统+Spring Boot

    1.简介 无入侵的分布式日志系统,基于log4j.log4j2.logback搜集日志,设置链路ID,方便查询关联日志.         基于elasticsearch作为查询引擎.          ...

  9. Spring Boot Admin在线查看spring boot后台日志

    当前,应用系统微服务架构.前后端分离(前端vue,后端springboot),已经成为大部分项目的标准技术架构,但在项目上线后,spring boot后端服务部署在服务器上,大部分公司对服务器都有安全 ...

最新文章

  1. Opencv实战 | 用摄像头自动化跟踪特定颜色物体
  2. php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
  3. java sql参数_java-从SQL查询检索参数
  4. php网页,想弹出对话框, 消息框 简单代码
  5. redis缓存清除策略 、获取dumb.rdb或者***.aof文件的位置
  6. BlockChange丨谁在监管加密货币?各国数字货币政策情况概览
  7. java编程找异数,异类Outliers_又名异数Malcolm_Gladwell.pdf
  8. 使用selenium模拟登录QQ空间
  9. 页面增加问号图标,鼠标放置会提示文字信息。(记录日志)
  10. 一文道尽 Excel 的 Criterion
  11. 计算机信息数字化基础1测验题,20春-计算机信息技术-章建民-1-中国大学mooc-题库零氪...
  12. 为什么大数据工程师比Java程序员工资高
  13. win安装夜神安卓模拟器
  14. Rotten Tomatoes 电影数据分析
  15. Robotaxi进入“大洗牌”时代,主机厂成接盘侠
  16. Python标准-模块版本号命名-PEP-396PEP-386
  17. 易中天品汉代风云人物08:韩信成败之谜
  18. CLAHE算法实现图像增强「AI工程论」
  19. matlab focuss算法,惩罚参数及p范数对FOCUSS算法影响的仿真分析
  20. 约克大学计算机语言班,约克大学语言班

热门文章

  1. 通信原理-随相数字信号的最佳接收
  2. 基坑监测日报模板_长沙一工地基坑坍塌致2人死亡!基坑坍塌的瞬间,只有无能为力和惊心动魄!...
  3. 《剑指offer》c++版本 18.删除链表的结点
  4. linux系统安装tv软件下载,达龙云电脑apk下载
  5. 添加halcon图像显示控件_初级应用实战来咯!C#联合Halcon读取图像,带讲解!!...
  6. perl语言入门第七版中文_python和c语言哪个简单
  7. php nginx配置范例,nginx配置文件范文
  8. r指引到文件夹_R语言中进行文件夹及文件夹内文件操作范例
  9. mysql get lock_MYSQL-GET_LOCK锁
  10. java $.class_java文件编译后额外生成的$1.class是怎么一回事