目录
我们常用的日志框架有Log4j、Log4j2、Logback和JUL(Java Util Logging)。除了日志框架,常用的还有日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用),Commons Logging和Slf4j。
- 框架具体实现 Log4j、Log4j2、Logback和JUL
- 接口规范 Commons Logging和Slf4j
推荐使用Commons Logging和Slf4j这种“面向接口”的设计方式,它不是一种具体的日志实现,可以灵活支持其他的日志实现框架
框架的由来
-
1996年,欧洲安全电子市场项目组决定编写它自己的程序跟踪API(Tracing API)。经过不断的完善,这个API终于成为一个十分受欢迎的Java日志软件包,即Log4j。后来Log4j成为Apache基金会项目中的一员,这让 Log4j 近乎成了Java社区的日志标准。据说Apache基金会还曾经建议Sun引入Log4j到java的标准库中,但Sun拒绝了。
-
2002年JDK1.4发布,Sun推出了自己的日志库JUL(Java Util Logging),其实现方法基本上模仿了Log4j。但在JUL出来以前,Log4j就已经成为一项成熟的技术,这使得Log4j上占据了一定的优势。
-
接着,Apache推出了Jakarta Commons Logging,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用Commons Logging的接口,底层实现可以是Log4j,也可以是Java Util Logging。
-
2006年,Ceki Gülcü(Log4j的主要贡献者)不适应Apache的工作方式,离开了Apache。然后先后创建了Slf4j(日志门面接口,类似于Commons Logging)和Logback(Slf4j的实现,类似于Log4j)两个项目,并回瑞典创建了QOS公司,QOS官网上是这样描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。
-
在2012年,Apache直接推出新项目,不是Log4j1.x升级,而是新项目Log4j2,因为Log4j2是完全不兼容Log4j1.x的。并且很微妙的,Log4j2几乎涵盖Logback所有的特性,更甚者的Log4j2也搞了分离的设计,分化成log4j-api和log4j-core,这个log4j-api也是日志接口,log4j-core才是日志产品。。。
产生的顺序为
- log4j
- JUL
- JCL
- Slf4j
- Logback
- log4j2
接下来我们来介绍每一种的框架简单使用,实际使用中,推荐使用Logback 和 log4j2
Log4j
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
import org.apache.log4j.Logger;
public class Log4jTest {
private final static Logger logger = Logger.getLogger("logTest");
public static void main(String[] args) {
logger.info("log4j test");
}
}
JUL
jul全程是java Util Log,它是jdk自带的日志实现,不需要引入其他依赖包,直接使用即可。
import java.util.logging.Logger;
public class JulLogTest {
private final static Logger logger = Logger.getLogger("JulLogTest");
public static void main(String[] args) {
logger.info("jul test");
}
}
JCL
jcl是java commons logging的简称,它不是具体的日志实现框架,而是一种日志框架的抽象,使用步骤如下:
1.添加commons logging依赖包
注意log4j的依赖包不是必须的,如果没有引入log4j依赖包,则使用的是jul日志实现
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--log4j日志配置-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.使用demo
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JclLogTest {
private final static Log log = LogFactory.getLog("jclLogTest");
public static void main(String[] args) {
log.info("jcl test");
}
}
可以发现Log 和 LogFactory的引用来自于commons logging,底层具体的实现是log4j或者jul。这就提供了便利,当需要更换实现时,不需要改动代码只需要替换依赖即可,这就是面向接口的好处
Slf4j
添加依赖
Slf4j+log4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
Slf4j+JUL
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.2</version>
<scope>runtime</scope>
</dependency>
Slf4j+JCL
可能大家疑惑JCL不是接口么,为什么也可以当做具体实现框架,因为JCL中提供了一个Simple Log的简单实现,所以可以作为实现框架
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.7.2</version>
<scope>runtime</scope>
</dependency>
关于Logback 与 Log4j2的依赖在,他们单独中介绍,都是使用slf4j作为门面
具体使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogTest {
private final static Logger logger = LoggerFactory.getLogger("Slf4jLogTest");
public static void main(String[] args) {
logger.info("slf4j test");
}
}
Logback
Logback -- 使用_naki_bb的博客-CSDN博客
Log4j2
Log4j2 -- 使用_naki_bb的博客-CSDN博客
SpringBoot默认的日志框架
SpringBoot支持log4j、logback作为日志框架。 如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。Spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。
不建议在application.yml 或者 application.properties中配置日志相关信息,在日志配置文件中配置更好。
配置文件
SpringBoot 官方推荐优先使用 -spring的文件名作为 你的日志配置(如logback-spring.xml),,当然是推荐,直接logback.xml也可以。
如果将日志实现框架更换成log4j2,则文件名推荐是 log4j2-spring.xml,log4j2.xml
将配置文件放置到classpath下: src/main/resource
如何在springboot使用log4j2
因为log4j2是建立在log4j和logback的基础上的增强版,性能最好,所以选用log4j2!!!!
1.先排除springboot默认的logback日志
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
2.然后添加log4j2的组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>