1.SpringBoot日志关系:
SpringBoot使用它来做日志功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐logging</artifactId>
</dependency>
底层依赖关系
但是呢,实际开发中我们不需要直接添加该依赖。
因为spring-boot-starter 其中包含了 spring-boot-starter-logging ,该依赖内容就是 Spring Boot 默认的日志框架 logback 。
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要 把这个框架依赖的日志框架排除掉即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring‐boot‐starter‐logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐log4j2</artifactId>
</dependency>
2.SpringBoot日志的使用
2.1 默认配置使用
SpringBoot默认帮我们配置好了日志
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
1)控制台输出:
日志级别从高到低分为:TRACE < DEBUG < INFO < WARN < ERROR
。
如果设置为 INFO
,则低于 INFO
的信息都不会输出。
Spring Boot 中默认配置 ERROR
、 WARN
和 INFO
级别的日志输出到控制台。
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
logger.trace("这是trace日志...");
logger.debug("这是debug日志...");
//SpringBoot默认给我们使用的是info级别的,
logger.info("这是info日志...");
logger.warn("这是warn日志...");
logger.error("这是error日志...");
}
如果每次都写这行代码LoggerFactory.getLogger(getClass());
会很麻烦,可以使用注解,但是需要使用 lombok
:
① 添加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--可以直接用boot自带版本-->
<version>1.8.12</version>
<optional>true</optional>
</dependency>
② 允许注解处理:Settings -> Compiler -> Annotation Processors
③ 使用:
2)文件输出:
默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件
使用 Spring Boot 可以在 application.properties 或 .yml 配置简单的使用
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
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
生效
3)级别控制:
在application.properties中进行配置:
格式为: logging.level.* = LEVEL
logging.level
: 日志级别控制前缀
*
: 包名或者Logger名
LEVEL
:选项 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
2.2自定义配置
因为SpringBoot默认日志配置只能满足简单的场景,像区分日志级别文件、每天一个日志文件等复杂需求就无法满足,所以可以使用日志框架自己的配置文件。
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or 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 |
如果你想针对不同运行时 Profile 使用不同的日志配置,自己配置LogBack日志文件的名字,则可以在boot配置文件中进行指定:
logging.config=classpath\:logback-dev.xml
一般不需要这个属性,而是直接在 logback-spring.xml
中使用 springProfile 配置,不需要 logging.config
指定不同环境使用不同配置文件。 springProfile 配置在下面介绍。
日志配置文件详解
① 根节点:<configuration>
包含的属性:
- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
根节点下面包含了5个子节点:
② 字节点:<contextName>
设置上下文名称
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过 %contextName
来打印日志上下文名称,一般不用这个属性,可有可无。
<contextName>logback</contextName>
③ 字节点:<property>
设置变量
用来定义变量值的标签, 有两个属性,name和value;通过定义的值会被插入到logger上下文中。定义变量后,可以使${}
来使用变量。
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="app/log" />
<!-- 定义日志文件名称 -->
<property name="appName" value="mhh"></property>
④ 字节点:<appender>
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。
控制台输出:ConsoleAppender
示例一:使用layout
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
示例二:使用encoder
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
encoder 和 layout 在作用上没有本质区别。但是自0.9.19版本之后,极力推荐使用encoder。
输出到文件:FileAppender
、 RollingFileAppender
用法都一样,这里不详细展开,详细可看appender数据源
随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。 RollingFileAppender
用于切分文件日志:
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期<File> 的日志都是当天的。-->
<file>${LOG_HOME}/${appName}.log</file>
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--过滤 Error-->
<level>Error</level>
</filter>
<!--当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动重命名TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。 -->
<MaxHistory>365</MaxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
⑤ 子节点:<root>
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger。
<root level="debug">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
⑥ 子节点:<logger>
<loger>
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 <appender>
。
常用属性:
name
:用来指定受此loger约束的某一个包或者具体的某一个类。
level
:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity
:作用在于children-logger是否使用 rootLogger配置的appender进行输出。即是否向上级loger传递打印信息。默认是true。
false:表示只用当前logger的appender-ref,
true:表示当前logger的appender-ref和rootLogger的appender-ref都有效
多环境日志输出
<configuration>
...
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<springProfile name="test,dev">
<logger name="com.example.demo.controller" level="DEBUG" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
<!-- 生产环境. -->
<springProfile name="prod">
<logger name="com.example.demo.controller" level="INFO" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
</configuration>
这里给上一个真实项目的日志配置文件,以便于对应理解 下载地址