日志框架发展史
System.out.println 的方式输出
日志框架功能:
-
把日志记录在文本中
-
日志信息按天进行备份
-
日志信息按等级输出
-
出现错误日志时发邮件通知
-
异步日志输出
-
日志输出格式定义
开源 log4j 收到广大开发者欢迎,被apache基金会收纳;
jdk官方sun,开发一个日志框架jul (java.util.logging); spring
这时候市面上的日志框架非常的混乱,一个项目,一个模块log4j,一个模块jul,或者jboss-logging。
jdk开发了一个日志门面JCL jakarta Commons Logging ,日志门面(不实现日志功能,整合日志的)
apache基金会员工张三单独开发日志门面slf4j,(不实现日志功能,整合日志的)
适配器:
桥接器:
模块1:官方 JCL门面,实现jul
模块2:slf4j --->(桥接器) --->log4j
后面apache开发log4j2
后面张三开发logback
日志实现 | 日志门面 |
---|---|
log4j | JCL |
jul java.util.logging | SLF4J |
log4j2 | SLF4J |
logback | SLF4J |
开源领域:log4j(日志实现) + slf4j(日志门面) + 桥接器
<!--log4j 核心依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--slf4j 核心依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!--slf4j 到 log4j 的桥接器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
官方领域:Jul(日志实现) + JCL(门面)
<!--JCL 门面依赖-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
JCL默认配置:如果能找到Log4j则默认使用log4j实现,如果没有则使用jul(jdk自带的)实现,再没有则使用jcl内部提供的SimpleLog实现。
common-logging.properties 中指定的 ------> 系统环境变量 ------> log4j ------> jul ------> simplelog ------> nooplog
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Log log = LogFactory.getLog(JulMain.class);
log.trace("trace");
Log具体的实现类,JCL会在ClassLoader中进行查找。
缺点:
-
效率底下
-
容易引发混乱
-
使用了自定义的ClassLoader的程序容易引发内存泄漏
JCL ------> (适配器) SLF4J
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
SpringBoot 默认使用日志框架logback
<!--Springboot 官方原配-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>