现有日志框架采用面向接口编程。
- 日志门面(日志的抽象层),如下:
JCL(Jakarta commons Logging) 、 SLF4J(Simple Logging Facade for Java)、jboss-logging - 日志实现,如下:
JUL(java.util.logging)、Log4j、Log4j2、Logback
因此在选择日志框架的时候,我们只需门面(抽象层)选一个,实现选一个。
抽象层:
- JCL最近的更新是在2014年(1.2 Release - July 2014),等于不维护。
- jboss-logging一般在特定的框架使用,如hibernate
实现层:
- log4j和logback是一个人写的。log4j作者后期觉得有性能问题,但是要对log4j升级的话,改动有点大,于是又写了个logback。与此同时,还写了个日志门面叫slf4j来统一目前及以后的日志实现。
- JUL是java工具包自带的 ,据说是怕日志市场被占有所以在log4j出来的时候赶紧弄这么一个功能,目前几乎没看到使用的。
- log4j2 是 apache公司借用log4j的名称开发的,反馈挺好的。但是主流框架并没有适配。
SpringBoot:底层是Spring框架,Spring框架默认是用JCL;‘
但是SpringBoot选用 SLF4j和logback;
因此我们选择的也是slf4j和logback
导入slf4j的jar和logback的实现jar就可以使用。
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");
}
}
如果想使用其他的实现jar,我们在编程的时候依旧使用slf4j编程,只需要在导入中间适配jar即可,以log4j为例,我们只需要在导入slf4j、log4j、slf4j-log4j12(中间层jar)就可以实现以log4j来记录日志。
原理就是调用slf4j方法的时候中间层实际上在中间层的实现是继续调用log4j的方法。
我们可以看到Springboot在使用日志框架的时候已经把其他的日志框架转成了slf4j。
注意:为了不引起冲突,我们在引入其他框架的时候。为了不导致使用的换乱,我们需要把框架不同的日志记录包移除掉。采用springboot使用的slf4j+logback模式
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
springboot默认帮我们配置好了日志的格式:
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
我们也可以在配置文件中自己修改格式
logging.level.com.atguigu=trace
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n