日志框架之Logback
Posted 寻渝记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志框架之Logback相关的知识,希望对你有一定的参考价值。
1 日志框架选择
日志门面:SLF4J
日志实现:Logback
2 实现控制台的日志打印输出01
2.1 在需要实现日志信息打印的类中实例化Logger对象
坑01:springBoot项目默认使用slf4j的logback来实现日志处理,所以我们在导入日志相关的包是必须是 org.slf4j.Logger
private final Logger logger = LoggerFactory.getLogger(getClass());
注意01:getClass() 可以换成 类名.class
注意02: 与日志相关的包导入的是 org.slf4j 下面的
技巧01:LoggerFactory.getLogger() 中的参数是会包含在日志信息中的,所以参数必须是本类名,这样就可以根据日志信息准确的定位到日志产生处,如果写成其他的类名名就很容器造成歧义。
2.2 通过日志对象调用相应的方法实现日志的打印
log.debug("===debug==="); log.info("===info==="); log.warn("===warn===");
2.3 运行,在控制台观察打印信息【我使用的是一个测试类】
注意01:这里没有打印出debug相关的log信息,那是因为spring默认配置的日志级别是info,只有在info及以上级别的日志信息才会被打印出来
技巧02:如何查看 日志级别 信息
通过 navigate -> class 打开类名搜索窗口,IDEA的快捷键是 ctrl + N
输入 Level
选择 org.slf4j.event
从源代码中可以看出 debug 的日志级别要低于info的日志级别(数字越大级别越高)
2.4 控制台的日志输出信息
从控制台的输出信息可以看出,即使我们没有对log进行任何配置还是按照某种日志输出格式进行了输出;这是因为SpringBoot的logback日志框架有一些默认的日志配置,这就是SpringBoot默认大于配置的强大之处,如果开发者不进行任何配置时就会使用默认的配置。
2.5 查看SpringBoot默认的日志配置
在依赖文件中找到logback先关的包,正式由于这些默认的日志配置文件才出现了2.4的输出结果
3 实现控制台的日志打印输出02
3.1 在相应的类上添加 @Slf4j 注解
注意01:需要额外导入相关jar包,这个lomboc依赖包不仅包含一些日志相关的还包含一些Get/Set相关的
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
3.2 在需要进行日志输出的地方直接使用log对象的相关方法进行啦
问题01: 在使用了 @Slf4j 注解,并且导入相关jar包后,log对象出现找不到的错误信息
解决01:安装lombok相关插件,具体步骤请参见:点击前往
3.3 运行项目,观察控制台信息【我使用的是一个测试类】
3.4 如何在日志中输出变量
@Test public void Test03() { String name = "warrior"; Integer age = 24; log.info("===姓名:{} = 年龄:{}", name, age); }
4 日志配置之利用yml文件进行配置
如果只是对日志信息进行一些简单的配置就可以通过yml配置文件后者properties配置文件进行
技巧01:通常在yml或者properties配置文件中只配置日志输出级别和日志文件存储路径,其他的都使用SpringBoot原生的配置
logging:
level:
cn.xiangxu.demo.log: debug
# file: "C:/Users/a/Desktop/fury/log/logInfo.log"
path: "C:/Users/a/Desktop/fury/log"
# 坑01:level 设置必须制定一个包名
# 坑02:path 和 file 只能设置一个
坑01:path 和 file 只能设置一个,而且 path 仅仅是路径而已,具体日志文件名会使用 spring.log ;而 file 不经需要设置路径还要指定日志文件名,最末尾就代表日志文件名
坑02:如果直接将 level 设置成 level: debug 这种形式就会报错,错误信息如下;因为之前版本的SpringBoot如果像这样设置就会对整个项目设置日志输出级别,我使用SpringBoot2.0版本时就会出现这种错误;解决办法时在设置 level 时指定一个包;参考博文:点击前往
4.1 控制台输出的日志信息
技巧01:日志文件中的日志信息和控制台输出的日志信息是一致的
技巧02:从日志输出信息可以看出调试的日志信息也被打印出来了,这是因为我们在设置日志的输出级别时设置的是 debug 级别
5 日志配置之利用xml文件进行配置
5.1 在 resources 目录下创建一个名为 logback-spring.xml 的日志文件
5.2 配置结果说明
技巧01:一个配置文件中可以配置多个 appender 来处理日志输出
技巧02:在 appender 由 layout 或者 encoder 负责日志格式化相关配置
技巧03:在 appender 中通过 rollingPolicy 来设置日志滚动配置(例如:每天产生一个日志文件)
技巧04:在 appender 可以通过 filter 来过滤日志级别
》LevelFilter
主要过滤日志级别,只用满足条件的日志级别会被处理;必须通过 onMatch 和 onMismatch 设置匹配到的和没匹配到的状态;状态种类如下
例子:
<onMatch>DENY</onMatch> -->> 表示对匹配到的日志级别不做处理
<onMismatch>DENY</onMismatch> -->> 表示对未匹配到的日志级别不做任何处理
》ThresholdFilter
主要过滤某个日志级别及其之上的日志级别
坑01:不可以通过 onMatch 和 onMismatch 设置匹配到的和没匹配到的状态
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--控制台日志配置--> <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> <!--文件日志配置【info以及warn】--> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern> C:/Users/a/Desktop/fury/log/fileInfoLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--指定日志配置应用位置--> <root lever="info"> <appender-ref ref="consoleLog" /> <appender-ref ref="fileInfoLog" /> <appender-ref ref="fileErLog" /> </root> </configuration>
5.3 完整的日志配置文件
参考博文:点击前往
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--控制台日志配置--> <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> <!--<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern>--> <!--</encoder>--> </appender> <!--文件日志配置【info以及warn】--> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--过滤日志级别:此处是将匹配到的排除,未匹配到的保留--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <!--格式配置--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> <!--滚动配置(按照日期生成日志文件)--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名配置--> <fileNamePattern> C:/Users/a/Desktop/fury/log/fileInfoLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--日志文件配置【error及其以上的都会被处理】--> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--过滤日志级别:此处是指保留匹配到的级别--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <!--日志格式配置--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> <!--滚动配置--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名配置--> <fileNamePattern> C:/Users/a/Desktop/fury/log/fileErrorLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--日志文件配置【fileDebugLog】(仅仅处理DEBUG级别)--> <appender name="fileDebugLog" 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> <!--日志格式配置--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> <!--滚动配置--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名配置--> <fileNamePattern> C:/Users/a/Desktop/fury/log/fileDebugLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--指定日志配置应用位置--> <root lever="info"> <appender-ref ref="consoleLog" /> <appender-ref ref="fileInfoLog" /> <appender-ref ref="fileErrorLog" /> <appender-ref ref="fileDebugLog" /> </root> </configuration>
5.4 在配置文件中对日志进行相关配置(参考)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--控制台日志配置--> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %d - %msg - %n </pattern> </layout> </appender> <!--文件日志配置【info以及warn】--> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--过滤日志级别:此处是将匹配到的排除,未匹配到的保留--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <!--格式配置--> <encoder> <pattern> %d - %msg - %n </pattern> </encoder> <!--滚动配置--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名配置--> <fileNamePattern> C:/Users/a/Desktop/fury/fileInfoLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--日志文件配置【error】--> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--过滤日志级别:此处是指保留匹配到的级别--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <!--日志格式配置--> <encoder> <pattern> %d - %msg - %n </pattern> </encoder> <!--滚动配置--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名配置--> <fileNamePattern> C:/Users/a/Desktop/fury/fileErrorLog.%d.log </fileNamePattern> </rollingPolicy> </appender> <!--指定日志配置应用位置--> <root lever="info"> <appender-ref ref="consoleLog" /> <appender-ref ref="fileInfoLog" /> <appender-ref ref="fileErrorLog" /> </root> </configuration> <!--<beans xmlns="http://www.springframework.org/schema/beans"--> <!--xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"--> <!--xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">--> <!--</beans>-->
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!--<property name="LOG_HOME" value="./logs" />--> <property name="LOG_HOME" value="C:/Users/a/Desktop/fury/log" /> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/runtime.log.%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <configuration scan="false" scanPeriod="60000" debug="false"> 3 以上是关于日志框架之Logback的主要内容,如果未能解决你的问题,请参考以下文章SpringBoot系列之集成logback实现日志打印(篇二)