• 你还不懂java的日志系统吗


    一、背景

    在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干的一件事,同时系统正常运行过程中必要的日志打印也是必须的。

    二、详情

    在笔者刚接触java程序的时候,打印日志经常使用到到下面的代码,

    System.out.println("hello log");

    我相信在不了解日志系统的前提下使用上述的方式是最多的,同时也是新手小白最常用的方式,笔者曾经也是使用最多的。那么除了上述的方式还有其他的方式吗?答案是肯定的

    2.1、java自带的日志

    在java的API中提供了一套日志打印的方法,java程序人员在设计之初已经想到了这方面的功能,所以从JDK1.4起提供了日志打印的API,只不过被大多数人忽略了。这套API在java.util.logging包下,使用该种方式不需要引任何的jar,只要在java环境下即可使用。

    如上图,是java提供的日志的一些类。使用方法类似下面的代码,

    public static Logger logger=Logger.getLogger(Test.class.toString());
    logger.info("hello log");

    注意Logger的路径是java.util.logging.Logger。

    2.2、log4j

    log4j是apache的一个项目,其中又分为log4j1和log4j2,所谓log4j1指的就是其大版本号为1,不过log41在很早之前就已经停止更新了,源码官网:https://github.com/apache/logging-log4j1

    可以看的在2012年已经停止更新了,也就是说现在通常来说使用的log4j都是log4j2,更确切的说是log4j,为了准确期间,这里还是和之前的版本进行区分,使用log4j2的名字,log4j2是在log4j1基础上的升级,并吸收了logback这个框架的优秀之处且修复了其很多问题,可以说log4j2是一个优秀的日志框架,其源码官网:https://github.com/apache/logging-log4j2

    官网:https://logging.apache.org/log4j/2.x/index.html

    log4j2的maven依赖如下,引入log4j-api和log4j-core即可,

     <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.17.1</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.1</version>
      </dependency>

    这里有个问题要注意,log4j1和log4j2的groupId是不一样的,log4j1的是org.apache.log4j,log4j2的是org.apache.logging.log4j,带来的变化就是在使用的过程中要注意引用的类的路径,从路径上可以确定是使用的log4j1.x还是log4j2.x,如果是org.apache.log4j开头的包路径那么是版本1的,是org.apache.logging.log4j开头的是版本2的。

    使用方式类似如下,

    private static final Logger logger= LogManager.getLogger();
    logger.info();

    2.3、logback

    logback是一个开源的日志框架,是log4j的作者为了代替log4j而开发的。logback包含三部分,logback-core、logback-classic、logback-access,logback-core是其他两个模块的核心,常用到的是logback-core+logback-classic。logback-access常和jetty和tomcat结合。

    logback的groupId为ch.qos.logback,其maven依赖如下

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.10</version>
      </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.10</version>
      </dependency>
    <!--平时用不到,可不引入-->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>1.2.10</version>
      </dependency>

    使用方法可参考:https://www.jianshu.com/p/3e3b550920b3

    其官网:https://logback.qos.ch/index.html

    2.4、slf4j

    slf4j不能称之为一个日志框架,因为它仅仅提供了一系列的标准,提供一系列接口,但没有实现,采用的是门面模式。

    其依赖为:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
      </dependency>

    上面便是slf4j的核心包。

    注意:如果使用slf4j出现下面的日志

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

    说明没有日志实现框架,slf4j自己实现了一个日志框架,可以加上下面的依赖

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.36</version>
      </dependency>

    slf4j可以和其他具体的日志实现框架进行结合使用,如下

    上图是一个slf4j和其他日志框架结合的图形展示,

    slf4j+logback

    需要slf4j-api、logback-api、logback-classic三个包

    slf4j+JDK日志

    需要slf4j-api、slf4j-jdk14,其中slf4j-jdk14是slf4j和JDK日志结合的jar。

    slf4j+log4j

    需要slf4j+slf4j-log4j12

    slf4j+JCL

    需要slf4j、common-logging

    其官网:https://www.slf4j.org/

    2.5、JCL

    JCL是Jakarta Commons Logging的简写,又叫Apache Commons Logging,提供的是一个 Java 的日志接口,同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。

    其包为common-logging.jar包含了所有的功能,还有其他另外两个包common-logging-api、common-logging-adapters

    官网:https://commons.apache.org/proper/commons-logging/guide.html

    三、总结

    本文简单总结了java中常用的日志,其中slf4j和JCL是日志的接口,又都进行了简单实现,既可以自己单独使用,又可以和其他实现日志框架结合使用,如,log4j、logback、JDK logging等。

  • 相关阅读:
    Codeforces 1294E Obtain a Permutation
    Codeforces 1292C Xenon's Attack on the Gangs
    Codeforces 1292B Aroma's Search
    Codeforces 1288E Messenger Simulator
    Codeforces 1288D Minimax Problem
    Codeforces 1285E Delete a Segment
    P3368 【模板】树状数组 2 题解
    P3374 【模板】树状数组 1 题解
    P1494 [国家集训队]小Z的袜子 题解
    P2260 [清华集训2012]模积和 题解
  • 原文地址:https://www.cnblogs.com/teach/p/15887258.html
Copyright © 2020-2023  润新知