你真的懂java的日志系统吗

 更新时间:2022年02月14日 09:40:17   作者:北漂程序员  
日志管理的第一件事,就是日志的收集,日志收集是开发者必备的技巧,不管是哪个开发语言,哪个开发平台,日志收集的插件都是有很多选择的,下面这篇文章主要给大家介绍了关于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等。

到此这篇关于java日志系统的文章就介绍到这了,更多相关java日志系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java之InputStreamReader类的实现

    Java之InputStreamReader类的实现

    这篇文章主要介绍了Java之InputStreamReader类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot使用Jackson配置全局时间日期格式

    SpringBoot使用Jackson配置全局时间日期格式

    本文主要介绍了SpringBoot使用Jackson配置全局时间日期格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java实现单例模式之饿汉式、懒汉式、枚举式

    Java实现单例模式之饿汉式、懒汉式、枚举式

    本篇文章主要介绍了Java实现单例的3种普遍的模式,饿汉式、懒汉式、枚举式。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • 在2023idea中实现SpringBoot的IoC和AOP的方法

    在2023idea中实现SpringBoot的IoC和AOP的方法

    这篇文档详细介绍了如何在Spring Boot中实现IoC(控制反转)和AOP(面向切面编程),深入探讨了AOP的基本概念,包括AOP的作用、优势以及实现方式,最后,它提到了AOP的注解,如@Aspect、@Pointcut、@Before、@After、@AfterReturning、@AfterThrowing和@Around
    2024-11-11
  • 详解MyBatis延迟加载是如何实现的

    详解MyBatis延迟加载是如何实现的

    MyBatis 的延迟加载(懒加载)特性允许在需要使用关联对象数据时才进行加载,而不是在执行主查询时就加载所有相关数据,我们将通过以下几个方面来深入了解MyBatis的延迟加载实现机制,需要的朋友可以参考下
    2024-07-07
  • Java实现AES/CBC/PKCS7Padding加解密的方法

    Java实现AES/CBC/PKCS7Padding加解密的方法

    这篇文章主要介绍了Java实现AES/CBC/PKCS7Padding加解密的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • MyBatis实现递归查询的方法详解

    MyBatis实现递归查询的方法详解

    在项目开发过程中,往往会遇到多级菜单、分类等多层级结构数据的查询。本文就来为大家讲讲MyBatis实现递归查询的方法,感兴趣的可以动手尝试一下
    2022-08-08
  • Mybatis在sqlite中无法读写byte[]类问题的解决办法

    Mybatis在sqlite中无法读写byte[]类问题的解决办法

    这篇文章主要给大家介绍了关于Mybatis在sqlite中无法读写byte[]类问题的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 详解JAVA 强引用

    详解JAVA 强引用

    这篇文章主要介绍了JAVA 强引用的相关资料,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • 浅谈Java几种文件读取方式耗时

    浅谈Java几种文件读取方式耗时

    本文主要介绍了浅谈Java几种文件读取方式耗时,主要介绍了4种,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论