1.日志级别
logback有5种级别,分别是TRACE 、 DEBUG 、INFO 、WARN 、ERROR,定义于ch.qos.logback.classic.Level类中,如下:
如上图:
-
Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
-
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
-
Info:消息在粗粒度级别上突出强调应用程序的运行过程.
-
Warn:输出警告及warn以下级别的日志.
-
Error:输出错误信息日志.
-
OFF:表示关闭全部日志.
-
ALL:表示开启全部日志.
等级从低到高分别是TRACE < DEBUG < INFO < WARN < ERROR,如果logger没有被分配级别,name它将从有被分配级别的最近的父类那里继承级别,root logger默认级别是DEBUG;日志输出的时候,级别大的会输出,根据当前ROOT 级别,日志输出时,级别高于root默认的级别时会输出,比如如果root的级别是DEBUG,那么会输出DEBUG以及DEBUG级别以上的日志,也就是会输出DEBUG ,INFO , WARN 和ERROR。
2.用法介绍
配置文件读取步骤:
- 尝试在classpath下查找文件logback-test.xml
- 如果logback-test.xml文件不存在,尝试在classpath下查找logback.xml
- 如果两个文件都不存在,LogBack用BasicConfiguration自动对自己进行最小化配置,这样不需要添加任何配置就可以输出日志信息。
2.1简单的控制台输出日志(无配置文件,自动对自己进行最小化配置)
简单的控制台输出只需要两步操作,如下图所示:
2.2简单的控制台输出日志(配置文件)
配置文件名阔以自己指定,也可以用系统默认的配置文件名,logback-test.xml或logback.xml都行。
<?xml version="1.0" encoding="UTF-8" ?>
<!--scan默认值为true,表示配置文件如果发生改变,将会被重新加载-->
<!--scanPeriod 当上述scan参数为true时,此属性才生效,设置时间间隔,用来监测配置文件是否有被修改,单位默认是毫秒,默认的时间间隔是1分钟 -->
<!--debug 默认值为false,当此属性设置为true时,将打印出logback内部日志信息,实时查看logback内部运行状态-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- ConsoleAppender 控制台输出日志 -->
<appender name="console_ysw" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 设置日志输出格式 %d表示日期,%-5level表示级别从左显示5个字符宽度,%thread表示线程名,%logger日志输出所在的类的全限定类名,%msg:日志消息,%n是换行符-->
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
</pattern>
</encoder>
</appender>
<!-- 根输出级别为DEBUG,控制台中将出现包含debug及以上级别的日志-->
<!-- 日志输出级别 -->
<root level="debug">
<!-- ref值与上面的appender标签的name相对应 -->
<appender-ref ref="console_ysw" />
</root>
</configuration>
如下图为输出结果,大家阔以对照着刚刚的格式
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
对比着看一看,
2.3把日志输出到文件中(按天输出,一天一个日志文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!--scan默认值为true,表示配置文件如果发生改变,将会被重新加载-->
<!--scanPeriod 当上述scan参数为true时,此属性才生效,设置时间间隔,用来监测配置文件是否有被修改,单位默认是毫秒,默认的时间间隔是1分钟 -->
<!--debug 默认值为false,当此属性设置为true时,将打印出logback内部日志信息,实时查看logback内部运行状态-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义日志文件的存储地址,配置的./logs_ysw作为日志的输出根目录,所以LogBack自动在项目根目录下创建名叫做logs_ysw的文件夹-->
<!-- 使用property来定义常量,即以key-value的形式存取,需要使用${}进行取值,比如${LOG_HOME} -->
<property name="LOG_HOME" value="./logs_ysw"/>
<!-- 按照每天生成日志文件 -->
<appender name="file_ysw" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 设置日志输出格式 %d表示日期,%-5level表示级别从左显示5个字符宽度,%thread表示线程名,%logger日志输出所在的类的全限定类名,%msg:日志消息,%n是换行符-->
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
</pattern>
</encoder>
<!-- TimeBasedRollingPolicy按照时间进行拆分日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出的文件名 -->
<!-- %d表示按天拆分文件,即每天新生成一个日志文件 -->
<FileNamePattern>${LOG_HOME}/mylog%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- 日志文件保留天数(天) -->
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<!-- 日志文件最大的大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>20MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<!-- 根输出级别为DEBUG,文件中将出现包含debug及以上级别的日志-->
<root level="debug">
<!-- ref值与上面的appender标签的name相对应 -->
<appender-ref ref="file_ysw" />
</root>
</configuration>
在这里我定义的输出格式与控制输出格式是一样的,配置的./logs_ysw作为日志的输出根目录,所以LogBack自动在项目根目录下创建名叫做logs_ysw的文件夹,并且项目启动时第一次记录日志时会自动创建根据我们的命名方式的文件。
日志文件及内容如下图所示:
2.4自定义logger对象(以身试坑,重难点)
2.4自定义logger对象(以身试坑,重难点)
我们创建的对象默认没有父的话,那么默认的父对象为root logger,我们也可以自定义logger对象
<logger name="com.ysw"></logger>
name属性表示com.ysw包下的所有子包和类都属于上述自定义logger对象的子实现,也会是说上述logger为父类logger对象
<logger name="com.ysw" level="info" additivity="false"></logger>
其中还有两个属性,
其中additivity表示自定义logger是否继承root logger,为true时,表示继承root logger,表示当前logger的appender-ref和rootLogger的appender-ref都有效。(因为name="com.ysw,所以logger在com.ysw包子包或其子类中有效,logger是有作用范围的,其他包没有logger,还是默认用root打印输出)
如果写了 root标签并且里面有appender-ref子标签,则会输出两次,如图:
为false时,表示不继承root logger,表示只用当前logger的appender-ref ,日志只输出一次,additivity默认值为true。
level为日志级别,控制大于等于该日志级别的进行输出
另外当同时出现root 和自定义的logger时,
如果自定义的logger中additivity属性为false,即自定义logger不继承root logger,则此时root logger失效,使用自定义的logger进行打印,如下图:
配置文件:
打印结果:(此时additivity为false,即自定义logger不继承root logger,root logger为info类型,自定义logger为debug类型,最终还是有debug类型的日志输出)
如果自定义的logger中additivity属性为true,即自定义logger继承root logger,root logger中的内容(比如appender-ref)将被继承到自定义的logger中进行打印输出
如果没有自定义logger,系统将使用默认的root logger进行输出日志
2.5异步日志输出
2.5异步日志输出
在实际的开发过程中我们经常使用到的是异步的日志输出,同步的日志输出需要等待日志打印完毕后才会进行下一步操作,会影响到程序的性能,所以这里简单接受一下异步日志的用法,其实也比较容易,下面举例用异步日志输出到控制台:
<?xml version="1.0" encoding="UTF-8" ?>
<!--scan默认值为true,表示配置文件如果发生改变,将会被重新加载-->
<!--scanPeriod 当上述scan参数为true时,此属性才生效,设置时间间隔,用来监测配置文件是否有被修改,单位默认是毫秒,默认的时间间隔是1分钟 -->
<!--debug 默认值为false,当此属性设置为true时,将打印出logback内部日志信息,实时查看logback内部运行状态-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义日志文件的存储地址,不要在logback的配置中使用相对路径 -->
<property name="LOG_HOME" value="./logs_ysw"/>
<!-- ConsoleAppender 控制台输出日志 -->
<appender name="console_ysw" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 设置日志输出格式 %d表示日期,%-5level表示级别从左显示5个字符宽度,%thread表示线程名,%logger日志输出所在的类的全限定类名,%msg:日志消息,%n是换行符-->
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
</pattern>
</encoder>
</appender>
<!-- 异步日志输出 -->
<appender name="async_ysw" class="ch.qos.logback.classic.AsyncAppender">
<!-- ref值与上面的appender标签的name相对应 -->
<appender-ref ref="console_ysw" />
</appender>
<!-- 日志输出级别 -->
<root level="debug">
<!-- ref值与上面的appender标签的name相对应 -->
<appender-ref ref="async_ysw" />
</root>
</configuration>
2.6 屏蔽记录日志
2.6 屏蔽记录日志
在项目的配置文件(application.yml 或 application.properties)中进行如下配置,在application.yml配置文件内,off必须添加双引号,否则不会生效:
logging: level: com.ysw.logback.test: 'off'
添加如上配置后,就会屏蔽掉com.ysw.logback.test包下的日志打印,也就是说com.ysw.logback.test包下的所有类都不会打印出日志了。
3.配置文件总结
3.配置文件总结
为方便以后在用到的时候阔以快速查看其配置文件的配置用法,这里进行了汇总,每个配置上面都有一段注释,大家阔以参考使用:
ps:以下内容参考了http://www.51gjie.com
<?xml version="1.0" encoding="UTF-8" ?> <!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL --> <!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 --> <!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 --> <!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 --> <!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 动态日志级别 --> <jmxConfigurator/> <!-- 定义常量,类似与key-value的形式,log.home_dir作为日志文件的输出路径,之后用${log.home_dir}取出--> <property name="log.home_dir" value="/usr/local/springboot/log"/> <!-- 定义日志文件的输出文件名--> <property name="log.app_name" value="http-demo"/> <!-- 定义常量log.maxHistory,日志最大的历史 30天 --> <property name="log.maxHistory" value="30"/> <!-- 定义日志根级别,默认是DEBUG级别,我们也可以主动去定义,在下面会用到--> <property name="log.level" value="debug"/> <!-- 定义日志文件最大的大小--> <property name="log.maxSize" value="5MB" /> <!-- ConsoleAppender 控制台输出日志 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> <!-- 设置日志输出格式 --> %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n </pattern> </encoder> </appender> <!-- ERROR级别日志 --> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志拆分记录到其他文件 RollingFileAppender --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 过滤器,只记录WARN级别的日志 --> <!-- 过滤器会根据onMath 和 onMismatch接收或拒绝日志。 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置过滤级别 --> <level>ERROR</level> <!-- 用于配置符合过滤条件的操作,超过ERROR级别的日志输出到日志文件当中--> <onMatch>ACCEPT</onMatch> <!-- 用于配置不符合过滤条件的操作,没超过ERROR级别的日志进行拦截 --> <onMismatch>DENY</onMismatch> </filter> <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动, 即可以根据时间和文件大小进行拆分 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志输出位置 可相对、和绝对路径 --> <fileNamePattern> <!-- 下面中的%d表示安装天进行拆分日志文件,%i表示当某一天中日志文件大小超过 MaxFileSize标签规定的大小,i的取值会从1,2,3.....n这样的进行命令差分后的文件--> ${log.home_dir}/error/%d{yyyy-MM-dd}/${log.app_name}-%i.log </fileNamePattern> <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是30天, 则只保存最近30天的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 --> <maxHistory>${log.maxHistory}</maxHistory> <!--按照文件大小进行拆分--> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern> <!-- 设置日志输出格式 --> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </encoder> </appender> <!-- INFO级别日志 appender --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern> </encoder> </appender> <!-- DEBUG级别日志 appender --> <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern> </encoder> </appender> <!--设置一个向上传递的appender,所有级别的日志都会输出--> <appender name="ysw_all" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.home_dir}/app/%d{yyyy-MM-dd}/${log.app_name}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern> </encoder> </appender> <!-- name:用来指定受此loger约束的某一个包或者具体的某一个类。 level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。 addtivity:是否向上级loger传递打印信息。默认是true。 --> <!--org.springframework.web包下的类的日志输出--> <logger name="org.springframework.web" additivity="false" level="INFO"> <appender-ref ref="INFO"/> </logger> <!--com.zgd包下的类的日志输出--> <logger name="com.zgd" additivity="false" level="DEBUG" > <appender-ref ref="ysw_all" /> <appender-ref ref="ERROR" /> <!--打印控制台--> <appender-ref ref="CONSOLE" /> </logger> <!-- root级别 DEBUG --> <root> <!-- 打印debug级别日志及以上级别日志 --> <level value="${log.level}"/> <!-- 控制台输出 --> <appender-ref ref="CONSOLE"/> </root> </configuration>
完结
于2021.8.5