Spring Boot从入门到精通(八)日志管理实现和配置信息分析

Stella981
• 阅读 681

点击上方蓝色“Java精选”,选择“设为星标”

技术文章第一时间送达!

Spring Boot从入门到精通(八)日志管理实现和配置信息分析

Spring Boot对日志的处理,与平时我们处理日志的方式完全一致,它为Java Util Logging、Log4J2和Logback提供了默认配置。对于每种日志都预先配置使用控制台输出和可选的文件输出功能。

Spring Boot从入门到精通(八)日志管理实现和配置信息分析

如果使用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 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从入门到精通(八)日志管理实现和配置信息分析

注:日志系统在解析配置文件时所有支持获取系统属性的值,具体参考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;@SpringBootTestpublic 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的命名规则。

根节点包含的属性

scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。

scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。

debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

1)子节点

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)子节点设置上下文名称

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。

设置后不能修改,通过%contextName设置来打印日志上下文名称,一般来说不用这个属性。

3)子节点

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 ms2020-03-13 16:00:26.842 [http-nio-9090-exec-1] DEBUG c.y.s.demo04.HelloWorldController -访问 helloName,Name=yoodb2020-03-13 16:03:10.953 [http-nio-9090-exec-4] DEBUG c.y.s.demo04.HelloWorldController -关注微信公众号“Java精选”,Spring Boot系列文章持续更新中,带你从入门到精通,玩转Spring Boot框架。
    

   
   
   

日志文件内容如下图所示:

Spring Boot从入门到精通(八)日志管理实现和配置信息分析

本文“Spring Boot从入门到精通(八)日志管理实现和配置信息分析”文章的项目源码(springboot-study-demo04)地址:

https://github.com/yoodb/springboot

到此,关于Spring boot日志管理实现和相关配置信息的分析就讲完了,下面大家不妨试一试,但要注意使用的时候配置信息要求,有什么疑问欢迎下方留言,小编看到后立马回复!

关注我,回复“ Java ”免费领取视频教程和资料

回复“加群”加入专业技术讨论群^^

往期精选

Spring Boot从入门到精通(一)搭建第一个Spring Boot程序

Spring Boot从入门到精通(二)配置GitHub并上传Maven项目

Spring Boot从入门到精通(三)常用注解含义及用法分析总结

Spring Boot从入门到精通(四)连接MySQL数据库(附源码)

Spring Boot从入门到精通(五)多数据源配置实现及源码分析

Spring Boot从入门到精通(六)集成Redis实现缓存机制

Spring Boot从入门到精通(七)集成Redis实现Session共享

搞不定MyBatis面试,速看全面MyBatis面试题及答案整理总结

搞不定Redis面试,速看全面Redis面试题及答案整理总结

搞不定Zookeeper面试,速看全面Zookeeper面试题及答案整理总结

Spring Boot从入门到精通(八)日志管理实现和配置信息分析

我就知道你“在看”!

本文分享自微信公众号 - Java精选(w_z90110)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Spring Boot日志集成
!(https://oscimg.oschina.net/oscnet/1bde8e8d00e848be8b84e9d1d44c9e5c.jpg)SpringBoot日志框架SpringBoot支持JavaUtilLogging,Log4j2,Lockback作为日志框架,如果你使用star
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Stella981 Stella981
3年前
ClickHouse大数据领域企业级应用实践和探索总结
点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源!(https://oscimg.oschina.net/oscnet/bb00e5f54a164cb9827f1dbccdf87443.jpg)!(https://oscimg.oschina.net/oscnet/dc8da835ff1b4
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这