The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for
various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end
user to plug in the desired logging framework at deployment time.
官网对于slf4j的描述:SLF4J 是日志记录系统的简单外观,允许最终用户在部署时插入所需的日志记录系统
。
为什么不直接使用
system.out.println()
来打印我想看的信息?
system.out.println()
来打印我想看的信息?
因为system.out.println()
日志打印不可控制、也不能添加过滤器、打印时间无法确定、日志没有级别区分,而且无法将信息记录下来。
为了解决项目在运行过程中能够让开发人员清晰明了地知道项目地运行情况,log日志应运而生。现在的日志框架也是非常多的,常见的日志框架包括了JUL(java util logging)、JCL(jakarta commons logging)、Jboss-logging、logback、log4j、log4j2、slf4j
。
我们在项目中一般选择面向slf4j这种日志门户进行编程,但是日志底层的具体实现交给了不同的日志框架,例如交给log4j、logback……
日志框架一多java的很多技术栈中使用的日志框架就无法做到统一,比如说我的项目使用了A组件和B组件,A组件底层使用的日志框架是log4j,B组件底层使用的日志框架是jul,如果想要统一使用slf4j日志框架,我们也不需要挨个去检查调整相关底层的依赖。
SLF4J官网提供了一组桥接传统日志API的的模块,slf4j为我们提供了一些jar包:
jcl-over-slf4j.jar
可以用于替换 commons-logging
log4j-over-slf4j.jar
可以替换log4j
jul-to-slf4j.jar
可以替换jul
通过引入这些中间包
就可以达到既能够使用slf4j
日志框架又能够完美支持项目组件依赖的其他日志框架的目的。
我们常用的springboot项目选择的日志框架是slf4j+logback
的形式,什么意思?就是项目面向的是slf4j
,其实底层的日志框架具体实现使用的是logback
。
如何在springboot项目中使用slf4j框架?
官网给出了示例:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
日志的等级分为:trace
、debug
、info
、warn
、error
,从左往右日志等级依次递增,可以通过在项目中配置日志的输出等级从而达到只输出指定级别的日志信息。下面在新建项目中分别用5中等级打印一下日志信息:
package org.magic.log;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class LogApplicationTests {
private Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}
结果只打印出了info
、warn
、error
三种,debug
和trace
并没有打印出来,说明springboot默认的日志级别是info
,项目只会打印info
级别以上的日志。
通过在配置文件中设置日志级别来控制日志输出,我们可以配置全局日志输出级别或者指定某个目录下的日志输出级别:
示例:设置org.magic.log
目录下的文件的输出等级为trace
,重新启动项目测试类contextLoads
日志输出格式
%d 表示日期时间
%thread 表示线程名称
%-3level 级别从左显示3个字符长度
%logger{50} logger名字最长50个字符,否则按照句点分割
%msg 日志信息
%n 换行符
示例:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-3level %logger{50} --%msg%n
在项目的配置文件中自定义日志的输出格式:
#日志在控制台的输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-3level %logger{50} --%msg%n
#日志在日志文件中的输出格式
#logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-3level %logger{50} --%msg%n
#将日志信息输出到指定的日志文件中
logging.file.name=mylog.log