一文学懂 JAVA 日志框架

目录

框架的由来

Log4j

JUL

JCL

Slf4j

Slf4j+log4j

Slf4j+JUL

Slf4j+JCL

具体使用

Logback

Log4j2

SpringBoot默认的日志框架

配置文件

如何在springboot使用log4j2

我们常用的日志框架有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才是日志产品。。。

产生的顺序为

  1. log4j
  2. JUL
  3. JCL
  4. Slf4j
  5. Logback
  6. 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值