SpringBoot关于slf4j的相关优化设置

前提

springboot本身就内置了slf4j日志框架,我们可以直接去使用,不需要添加依赖。slf4j有个接口叫Logger,提供了丰富的日志输出方法,包含了所有日志级别的输出;使用方式也是特别的简单,用slf4j的工厂类LoggerFactory获取一个logger 对象,然后就可以输出日志了。但是默认情况下,日志只会输出到控制台;我们可以在配置文件中来修改日志的输出格式,把日志输出到文件中等。

在application.yml/properties中进行相关配置

如上图:

1、通过level设置要过滤的日志的级别

2、使用name指定日志文件的名称,可以包含文件的路径(可以是相对路径,也可以是绝对路径);相对路径是相对于项目根目录。

3、使用path指定日志文件的路径(可以是相对路径,也可以是绝对路径),不能包含文件名(如果指定了文件名,则也会把文件名当成路径);生成的日志文件名为spring.log。

4、需要注意的一点:name和path不要同时指定,如果同时指定了,则path无效,只有name有效。(其他设置不再描述,可以自行查询)

使用logback来进行相关配置

在resources目录下创建logback-spring.xml配置文件,该配置文件晚于application.yml加载;它可以完成yml/properties配置实现不了的功能,比如按天将日志归档等。logback-spring.xml的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--property定义的是变量,在下面的配置中会被使用-->
    <!-- 日志存放路径 -->
	<property name="log.path" value="/logs" />
    <!-- 日志输出格式 -->
	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

	<!-- 定义控制台输出的相关配置 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>   
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--当class配置为ThresholdFilter时,控制台输出的日志级别是大于或等于此级别的日志信息-->
            <level>INFo</level>
        </filter>
	</appender>

	<!-- 定义文件输出的相关配置 -->
	<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--当class配置为LevelFilter时,输出的日志级别只能是这个级别,不是它以及它以上的级别-->
            <!-- 过滤的级别   -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>
 

	<!-- 系统模块日志级别控制  -->
	<logger name="com.soc" level="info" /> 
	<!-- Spring日志级别控制  -->
	<logger name="org.springframework" level="warn" />
 
	<!--系统操作日志-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>
</configuration>

1、property就是定义变量,供下面的其他配置使用;

2、appender就是定义日志的输出方式,通过class来决定是输出到控制台,还是文件;appender中的file、rollingPolicy、encoder等标签通过上面代码中的注释都可以看明白;需要注意的就是filter,根据filter中class的不同,过滤级别的机制不一样,在上面的注释中有提及。ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。LevelFilter: 级别过滤器,根据日志级别进行过滤(日志级别等于配置级别时才符合过滤条件)。还有其他的Filter可选,自行查询。

3、logger和root

  • logger配置的name用于匹配在代码中LoggerFactory.getLogger(name/class)时的name/class;如果是class,则将class所在的包名拿来配置logger配置的name;
  • root不可再配置name属性,因为它的name就是root,在name上可以匹配所有的日志;
  • logger和root配置的level用于过滤日志的级别;凡是大于或者等于该level的日志都会被成功过滤;
  • logger和root都可以指定子标签appender-ref,用于指定定义好的日志的输出方式;

4、logger和root的父子关系对配置的影响

  • root和logger是父子关系,root可以理解为一个根节点,而其他的logger都可以看做root的子节点;
  • logger默认会叠加root中配置的appender-ref;可以根据属性additivity来决定是否要叠加root的appender-ref,默认为true;
  • logger的级别是其自身定义的级别,和root的级别没什么关系。但是当子logger未设置level属性时,会被设置为父级的level;(注意additivity和level的子父传递没有关系)

5、logback总结:判断一个类里日志的输出情况,首先根据name和level找到能匹配的logger(没有特别定义则默认为root),然后根据root和logger的子父关系以及是否设置有允许appender-ref的叠加,来找到满足条件的appender;再查看appender里配置的filter设置的过滤规则和过滤级别;最后就可以知道这个类的哪些日志会被输出到哪些地方了。注意:任何一个类只会和一个logger对应,要么是定义的logger,要么是root。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值