开发中Boot日志配置

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 中默认配置 ERRORWARNINFO级别的日志输出到控制台。

//记录器 
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。

输出到文件FileAppenderRollingFileAppender
用法都一样,这里不详细展开,详细可看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>

这里给上一个真实项目的日志配置文件,以便于对应理解 下载地址

猜你喜欢

转载自blog.csdn.net/qq_43386941/article/details/105864393