一、slf4j
1.基本概念
(1)简单日记门面(simple logging Facade for Java)SLF4J是为各种loging APIs提供一个简单统一的接口。
(2)slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade。
(3)在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。
如:选择JDK自带的日志系统,则只需要将slf4j-api-XXX.jar和slf4j-jdkXXX.jar放置到classpath中即可,若想换成log4j的日志系统,仅需要用slf4j-log4jXXx.jar替换slf4j-jdkXXX.jar即可
(4)slf4j和log4j比较:
①log4j看成是一个完整的日志库;而slf4j是一个日志库的规范接口,可以根据不同的日志包使用不同的日志库。
②日志中需要传入参数时,log4j一般是使用字符串进行拼接的方式;
slf4j使用占位符,比字符串拼接更加高效。如logger.error("sql为 {} ",sql)。
(5)slf4j日志级别
Slf4j日志级别,级别由低到高,设置的级别约低,打印的日志越多
①trace: 一般不会使用,在日志里边也不会打印出来,最低的一个日志级别。
②debug: 一般放于程序的某个关键点的地方,用于打印一个变量值或者一个方法返回的信息之类的信息
③info 一般处理业务逻辑的时候使用,就跟 system.err打印一样,用于说明此处是干什么的。
④warn:警告,不会影响程序的运行,但是值得注意。
⑤error: 用户程序报错,必须解决的时候使用此级别打印日志。
2.使用教程
官网上最新稳定版是1.7.32,前阵子log4j出重大漏洞了,这里我们配合logback(log4j的改良版,性能更好)使用。
(1)在pom.xml引入依赖
<!--slf4j依赖--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.32</version> </dependency> <!-- logback 依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
(2)在springBoot项目中添加一段controller代码
package com.example.springb_web.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class VisualController { private Logger logger = LoggerFactory.getLogger(VisualController.class); @RequestMapping(value="/test") @ResponseBody public String test(){ String msg = "fucking good"; logger.info("slf4j print info msg:{}",msg); logger.debug("slf4j print debug msg:{}",msg); return msg; } }
这里通过http://localhost:8080/test访问可以看到控制台输出如下,可以看到info的输出了,debug没有,因为springboot内部集成了slf4j,默认是info级别:
(3)只在控制台打印,application.yml文件配置如下:
# slf4j日志配置 logging: # 配置级别 level: root: info #分包配置级别,即不同的目录下可以使用不同的级别 com.example.springb_web.controller: debug
改完之后发现输出如下:
(4)把日志输出到文件,application.yml配置:
# slf4j日志配置 logging: config: classpath:logback.xml
在resource下新建logback.xml:
<configuration> <!-- 定义日志格式 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/> <!-- ConsoleAppender:控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】 --> <pattern>%d %p (%file:%line\)- %m%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引 --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过5MB时,对当前日志进行分割重命名--> <appender name="mylog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>D:/slf4j_log/springboot.log</File> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <fileNamePattern>D:/slf4j_log/springboot.%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为30天 --> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB --> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> %d %p (%file:%line\)- %m%n </pattern> <!-- 记录日志的编码 --> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <!-- 控制台输出日志级别 --> <root level="info"> <appender-ref ref="STDOUT" /> </root> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- 在这个根包下面的所有日志操作行为的权限都是DEBUG --> <logger name="com.example.springb_web.controller" level="DEBUG"> <!--与上面appender的name要一致--> <appender-ref ref="mylog" /> </logger> </configuration>
可以看到控制台和日志文件都成功输出了:
3.常见报错解决(持续更新)
(1)yml配置报错如:
“Failed to bind properties under ‘logging.level’”
可能跟版本有关,参考yml配置上面的使用教程的第(3)步
(2)启动时报错:
“class path contains multiple slf4j bindings
found binding in …”
不要忽视这种警告,若有多个jar包类冲突,需要把加载jar包顺序调整,正确的那个,比如slf4j-log4j12jar包放在最上面。