logback日志入门超级详细讲解

2021-10-09 10:03:37 浏览数 (1)

基本信息

日志:就是能够准确无误地把系统在运行状态中所发生的情况描述出来(连接超时、用户操作、异常抛出等等); 日志框架:就是集成能够将日志信息统一规范后输出的工具包。

Logback优势

Logback框架又有何优势,首先,我们得明白框架能够帮我能够做些什么?

  1. 自定义输出路径,后期好维护(方便运维的伙伴) 能够将日志信息存储到本地文件或存储到数据库中去,而且根据滚动策略设置一天一个文件
  2. 根据你的喜好,自定制日志的输出格式 可以通过配置文件修改日志文件的具体内容,在不改变原有业务代码的情况下改变输出格式,方便调试
  3. 随身携带着日志上下文信息 上下文中包含着时间戳、类的所在路径、所占用的堆栈信息和占用的线程等等
  4. 可选择运行时输出的内容 运行无误的时候,我们只在乎返回的运行信息;运行出错的时候,选择返回错误信息
  5. 配置方便、性能高 框架与业务代码耦合小,正常业务之外的审计和运维需求,与系统性能无关

框架配置

logback常用的有两种配置方案:

  1. 在SpringBoot项目自带的application.properties/application.yml里配置(这种配置都是简单的配置,SpringBoot已经集成好的)。 这种一般适用个人学习项目,快速开发的可以推荐
  1. 单独在resources文件下创建 logback.xml 配置文件,来进行更为复杂的配置。(推荐使用,配置信息足够详细)

总体代码

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="300 seconds" debug="false">
	<!-- 定义参数参数  -->
	<!-- TRACE<DEBUG<INFO<WRAN<ERROR -->
	<property name="log.level" value="debug"/>
	<property name="log.maxHistory" value="30"/>
	<property name="log.filePath" value="E:/study"/>
	<property name="log.pattern"
	 value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n"/>
	<!-- 控制台设置 -->
	<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
	</appender>
	<!-- DEBUG -->
	<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/debug.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留debug优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>DEBUG</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	
	<!-- INFO -->
	<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/info.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留info优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	
	<!-- ERROR -->
	<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/webapps/error.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留error优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	
		<!-- 该 logger 只会记录debug 优先级别以上的日志信息 -->
		<!-- 子logger -->
 	<logger name="com.hyxiao.logback.test" level="${log.level}" additivity="true">
 		<!-- 与append相绑定,logger文件会往这三个对象输出日志信息 -->
		<appender-ref ref="debugAppender"/>
		<appender-ref ref="infoAppender"/>
		<appender-ref ref="errorAppender"/>
	</logger>
	<!-- 父logger(上面的logger为子logger),当根logger没有设置 level 时 -->
	<!-- 则会继承父logger设置的lever等级,即输出 info(warn、error) 级别的信息 -->
	<root level="info">
		<appender-ref ref="consoleAppender"/>
	</root>
</configuration>

代码分析

  • 首先是 configuration 父标签,一般情况下,该标签可不添加任何属性(可选)
代码语言:javascript复制
<configuration scan="true" scanPeriod="300 seconds" debug="false">

设置 scan = “true”,配置文件发生改变,便会重新加载,默认为 true。 设置 scanPeriod=“300 seconds”,开启scan之后,300s内会去扫描配置文件的变化。 设置 debug = “false”,当设置为false时,系统不会输出logback底层的日志信息,即logback的运行状态

  • 其次是 property 子标签,设置 logback 的参数(可选)
代码语言:javascript复制
	<property name="log.level" value="debug"/>
	<property name="log.maxHistory" value="30"/>
	<property name="log.filePath" value="E:/study"/>
	<property name="log.pattern"
	 value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n"/>

log.level 指的是logback的日志级别,设置debug 日志级别总共分为五大级别,分别为 TRACE < DEBUG < INFO < WRAN < ERROR 当级别设置为 debug ,则按照优先级来输出,依次输出 debug,info,wran,error这四个等级的信息,trace优先级不够。 logback的优先级图如下:

log.maxHistory 指的是文件最大保存历史数量 log.filePath 指的是文件存储的根路径 log.pattern 指的是日志呈现的最终格式,

代码语言:javascript复制
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n

%d :指的是时间格式,{年月日小时分钟秒} [%thread]: 属于哪个线程执行 %-5level : 级别从左显示5个字符宽度,缩进5位来显示日志层级信息 %logger{50} -%msg :哪个类里面输出的日志信息 %n:换行符

  • 接下来是 appender 子标签

encoder属性( ${log.pattern }在 property 标签中已经配置,可直接引用)

代码语言:javascript复制
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>${log.pattern}</pattern>
        </layout>
    </appender>

DEBUG级别的设置

代码语言:javascript复制
	<!-- DEBUG -->
	<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/debug.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留debug优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>DEBUG</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

INFO级别的设置

代码语言:javascript复制
	<!-- INFO -->
	<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/info.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留info优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>

ERROR级别的设置

代码语言:javascript复制
	<!-- ERROR -->
	<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.filePath}/logs/webapps/error.log</file>
		<!-- 滚动策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 文件名称 -->
			<fileNamePattern>
				${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
			</fileNamePattern>
			<!-- 文件最大保存历史数量 -->
			<maxHistory>${log.maxHistory}</maxHistory>
		</rollingPolicy>
		
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<!-- 过滤器(仅保留error优先级的日志信息) -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
  • 最后一个子标签是 logger 和 root,用来存放日志对象,通知 logback 需要关注哪个包下的类信息
代码语言:javascript复制
		<!-- 该 logger 只会记录debug 优先级别以上的日志信息 -->
		<!-- 子logger -->
 	<logger name="com.hyxiao.logback.test" level="${log.level}" additivity="true">
 		<!-- 与append相绑定,logger文件会往这三个对象输出日志信息 -->
		<appender-ref ref="debugAppender"/>
		<appender-ref ref="infoAppender"/>
		<appender-ref ref="errorAppender"/>
	</logger>
	<!-- 父logger(上面的logger为子logger),当根logger没有设置 level 时 -->
	<!-- 则会继承父logger设置的lever等级,即输出 info(warn、error) 级别的信息 -->
	<root level="info">
		<appender-ref ref="consoleAppender"/>
	</root>

这上面的 additivity" 属性默认为true,当设置为 true 时,子logger会向root传递它收集好的信息,这里就是子logger会去root标签下,将appender-ref 添加到 子logger() 里面去,即子logger里面也能支持在控制台输出日志信息。

复习

logger:主要用于存放日志对象,定义日志类型和级别。 appender:用于指定日志输出的目的地,目的地可以是控制台,文件等等。 layout:格式化日志的输出信息。

~~~~ ~~~~ ~~~~

0 人点赞