Java技术进阶之日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java技术篇

日志系统的发展

我们日常接触到的日志系统有很多种,log4j,JUL(jdk自带),logback等,我们可以直接根据对象的日志API进行使用。但是考虑到API各不相同,所以出现了JCL(Jakarta Commons Logging)、slf4j等日志API框架。日志API框架只是统一的API,其底层的具体的日志记录工作还是由log4j、JUL、logback等承担。

如何选择和搭配日志系统

目前来说,新应用使用logback是首选,一些老系统中很可能使用的是log4j等。目前slf4j对logback和log4j都支持,对JCL也提供了桥接方法,将JCL的api转化slf4j的API。贴一张Webx中的图足以说明一切

1.png

组装日志系统

由于存在JCL,SLF4j两大日志框架,logback、log4j、JUL日志系统所以理论上有这么多种日志系统的搭配。

  • JUL
  • log4j
  • logback
  • jcl+log4j
  • slf4j+slf4j-log4j12+log4j
  • slf4j+logback
  • jcl-over-slf4j+slf4j+logback
  • jcl-over-slf4j+slf4j+slf4j-log4j12+log4j

其中slf4j+slf4j-log4j12+log4j、slf4j+logback是主流,推荐使用。

常见的日志包以及辅助包功能介绍

JCL(commons-logging)系列

  • commons-logging apache logging抽象日志工具,一般搭配log4j1/2使用
  • spring-jcl Spring自己的commons-logging同名类日志,Spring内部的日志调用的都是commons-logging包,优先选择Logj
  • jcl-over-slf4j slf4j提供的commons-logging同名日志类,通过同名类的方式替换实现方式为slf4j

SLF4j系列

  • slf4j-api Slf4j提供的日志抽象接口,不包含实现,具体使用何种日志实现需要引入对应的实现包
  • slf4j-jdk14 Slfj的jdk日志实现包
  • slf4j-log4j12 Slf4j的log4j1/2实现包

JUL系列

  • jul-to-slf4j Slf4j提供的jul实现包,通过jul提供的扩展接口,定制slf4j的实现

log4j系列

  • log4j log4j v1版本的包
  • log4j-api log4j v2版本的包
  • log4j-over-slf4j Slf4j提供的log4j v1版本的同名日志类,通过同名类的方式替换实现方式为slf4j
  • log4j-to-slf4j log4j v2通过spi机制提供的转换至slf4j的实现

多种日志工具共存时的解决方案

当依赖了一些三方库时,可能会出现多种日志共存的问题,无法保证每种日志抽象库都使用一样的实现类,此时需要制定固定的日志库。主流的日志库都提供了扩展方式

JUL(java.util.logging)

通过LogManager.getLogManager().getLogger("").addHandler()方法,可以添加日志具体实现LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());继承java.util.logging.Handler 类,在实现中使用具体的Logger库即可实现例子:jul-to-slf4j(https://www.slf4j.org/api/org...

JCL(org.apache.commons.logging)j

通过指定环境变量LogFactory,org.apache.commons.logging.LogFactorySystem.setProperty("org.apache.commons.logging.LogFactory","com.answern.claimv2.framework.log.LogFactoryImplAdapter");继承org.apache.commons.logging.LogFactory类,实现自己的LogFactory即可

还可以通过jcl提供的spi机制,实现自己的org.apache.commons.logging.LogFactory创建META-INF/services/org.apache.commons.logging.LogFactory文件,文件内定义LogFactory的完整类名即可。

还有另外一种暴力的方式:不引入commons-logging包,而是创建jcl的一些同名类,在实现中直接使用具体的日志库。jcl-over-slf4j(https://mvnrepository.com/art...)就是一个典型的例子.相同功能的还有spring-jcl(https://mvnrepository.com/art...

log4j

log4j提供了java对原生spi机制的支持建立MEATA-INF/services/org.apache.logging.log4j.spi.Provider文件继承org.apache.logging.log4j.spi.Provider类,实现自己的LoggerContextFactory即可实现例子:log4j-to-slf4j(https://logging.apache.org/lo...

SLFJ4J

slf4j官方介绍了使用方式,通过引入不同的jar包来使用具体的日志库。由于slf4j拆分做的很好,当多种日志库共存时,若不引入slf4j-xxx.jar时,不会加载相应的日志库。所以若日志冲突时,使用slf4j的三方库只需要include/exclude相应的实现库即可。

2.png

日志系统适配大全

附上一张可能是全网最全的日志框架适配图

3.png

编写自己的框架/类库时该如何选择日志库

由于日志库多种多样,如果盲目引入jcl或者slf4j时,可能会对具体使用的项目造成影响。所以最合适的方式是内嵌一套日志抽象,内部动态的去选择加载哪个日志库。主流的成熟框架都会这么做,尽可能的保持兼容性。

例如spring/mybatis/freemarker/dubbo这些框架,都有一套内嵌的日志抽象,打印日志时只需要调用内嵌的日志即可做到全兼容。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
2521
分享
相关文章
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
99 11
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
108 7
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
Java程序员在AI时代必会的技术:Spring AI
在AI时代,Java程序员需掌握Spring AI技术以提升竞争力。Spring AI是Spring框架在AI领域的延伸,支持自然语言处理、机器学习集成与自动化决策等场景。它简化开发流程,无缝集成Spring生态,并提供对多种AI服务(如OpenAI、阿里云通义千问)的支持。本文介绍Spring AI核心概念、应用场景及开发步骤,含代码示例,助你快速入门并构建智能化应用,把握AI时代的机遇。
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
60 12
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
CRaC技术助力ACS上的Java应用启动加速
容器计算服务借助ACS的柔性算力特性并搭配CRaC技术极致地提升Java类应用的启动速度。
|
4月前
|
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
1221 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
3133 2
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等