博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第六章:Spring Boot 默认日志框架配置(一)
阅读量:7172 次
发布时间:2019-06-29

本文共 7463 字,大约阅读时间需要 24 分钟。

hot3.png

Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。

一.默认日志Logback

 

SLF4J——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。

Spring Boot logBack默认启动日志信息

从上图可以看到,日志输出内容元素具体如下:

  • 时间日期:精确到毫秒
  • 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  • 进程ID
  • 分隔符:--- 标识实际日志的开始
  • 线程名:方括号括起来(可能会截断控制台输出)
  • Logger名:通常使用源代码的类名
  • 日志内容

配置方式:默认配置文件配置和引用外部配置文件配置

二.默认配置文件

Spring Boot为我们提供了很多默认的日志配置,所以,只要将spring-boot-starter-logging作为依赖加入到当前应用的classpath,则“开箱即用”。

  • 新建一个测试类,程序中引用logback
package com.black.example.controller;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(value = "/log")public class LogControllter {    private static final Logger logger = LoggerFactory.getLogger(LogControllter.class);    @RequestMapping(value = "/writeLog")    public String writeLog() {        logger.debug("这是debug模式日志");        logger.info("这是info模式日志");        logger.error("这是error模式的日志");        logger.warn("这是warn模式的日志");        return "日志级别测试";    }}

运行,访问http://localhost:8080/black/log/writeLog,可看到如下效果

0a2c060cc13a7932bc59bb07917e6a1a369.jpg

我们没有配置任何其它配置,就可以看到来自logback root logger的输出信息。虽然默认情况下logback是会打印debug级别的日志,但是我们注意到debug级别的日志没有记录下来,那是因为Spring Boot为Logback提供了默认的配置文件,base.xml,另外Spring Boot 提供了两个输出端的配置文件console-appender.xml和file-appender.xml,base.xml引用了这两个配置文件。

c8fb7318467907fff5b7898ef474217a331.jpg

根据base.xml的内容,可以看到,root logger的日志级别被重写为Info级别,这就是debug日志没有打印的 原因。

下面介绍几种在application.properties就可以配置的日志相关属性

  • 控制台输出 

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。

Spring Boot中默认配置ERROR、WARN和INFO级别的日志输出到控制台。您还可以通过启动您的应用程序--debug标志来启用“调试”模式(开发的时候推荐开启),以下两种方式皆可:

  • 在运行命令后加入--debug标志,如:$ java -jar springTest.jar --debug

  • 在application.properties中配置debug=true,该属性置为true的时候,核心Logger(包含嵌入式容器、hibernate、spring)会输出更多内容,但是你自己应用的日志并不会输出为DEBUG级别。

          623d8b7ac972c5e6f747e4fe7b0d8355170.jpg

 

  • 文件输出

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。

  • logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
  • logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。

如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log

注:二者不能同时使用,如若同时使用,则只有logging.file生效

默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO

d59a181c603a6463530f979daff846aaab2.jpg

  • 日志级别控制

所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中)
格式为:'logging.level.* = LEVEL'
logging.level:日志级别控制前缀,*为包名或Logger名
LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
举例:
27428f3e13b736038c07129b6cfbd9eae45.jpg 

三.日志文件详解

  • root节点说明

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。 
默认是DEBUG。 
可以包含零个或多个元素,标识这个appender将会添加到这个loger。

 

  • <contextName> 设置上下文名称

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无。

SpringBoot-logBack-demo
  • <property> 设置变量

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

  • ConsoleAppender 

fda976f50442b4e076a1ceb129823b05f00.jpg

<encoder>表示对日志进行编码

%d{HH:mm:ss.SSS}——日志输出时间

%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger{36}——日志输出者的名字
%msg——日志消息
%n——平台的换行符

%i——指定索引

  • RollingFileAppender

f011583d32b2e76cec7d5fffc7e8dd523ff.jpg

其中重要的是rollingPolicy的定义,上例中

<FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>定义了日志的切分方式——把每一天的日志归档到一个文件中,

<maxHistory>30</maxHistory>表示只保留最近30天的日志,以防止日志填满整个磁盘空间。

1GB
用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。

同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。
    默认是DEBUG。
    可以包含零个或多个元素,标识这个appender将会添加到这个logger。

 

三.引用外部配置文件

  1. logback配置方式

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,也就是说有自己默认命名的规范,放在/src/main/resources下即可。

 使用自定义配置文件,配置方式为:

##自定义配置文件名称logging.config=classpath:logback-black.xml

注意:不要使用logback这个来命名,否则spring boot将不能完全实例化

虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日志配置,这个功能会很有用。

多环境日志输出,不同级别的日志信息份文件存储,以logback-black.xml为例:

SpringBoot-logBack-demo
UTF-8
${PATTERN}
${TEST_FILE_PATH}/info.log
${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.%i.log
30
${LOG_FILE_SIZE}
UTF-8
${PATTERN}
INFO
ACCEPT
DENY
${TEST_FILE_PATH}/error.log
${TEST_FILE_PATH}/error.%d{yyyy-MM-dd}.%i.log
30
${LOG_FILE_SIZE}
UTF-8
${PATTERN}
ERROR
ACCEPT
DENY

正确加载logback-black.xml方式有两种,分别如下:

1.在application.properties中配置如下:

#主配置文件,配置了这个会优先读取里面的属性覆盖主配置文件的属性spring.profiles.active=dev
##自定义配置文件名称logging.config=classpath:logback-black.xml

根据上述配置,服务启动会加载dev模式的日志配置信息

2.启动服务时指定配置加载:

java -jar xxx.jar –spring.profiles.active=prod

 

转载于:https://my.oschina.net/zupengliu/blog/1827403

你可能感兴趣的文章
WebSocket,不再“轮询”
查看>>
HTTP 入门
查看>>
原型链
查看>>
工作中遇到的问题总结
查看>>
从最最最底层出发的深浅拷贝
查看>>
区块链技术对未来行业的影响
查看>>
d3实现中国地图实时刷新地图颜色.md
查看>>
HTML标签学习
查看>>
RunLoop的唤醒探索
查看>>
前端面试题(五)安全篇
查看>>
【刘文彬】【精解】EOS智能合约演练
查看>>
Web前端的发展前景真的这么好吗?
查看>>
调用微信公众号接口上传图片素材
查看>>
源码里面没有引入广告,但是访问网站时却能看到广告,该如何删除广告?
查看>>
我的友情链接
查看>>
Linux考证模拟试题二(含答案)
查看>>
Struts2优化
查看>>
我的友情链接
查看>>
浅谈Android五大布局
查看>>
安装SQL Server 2017
查看>>