清空运行中的jar 日志_Java日志体系权威总结
概要
本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志jar包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。
Log日志体系
在日常工作中我们可能看到项目中依赖的跟日志相关的jar包有很多,commons-logging.jar
、log4j.jar
、sl4j-api.jar
、logback.jar
等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。
背景/发展史
那就要从Java Log的发展历程开始说起。
log4j
(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目- Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了
JUL
(java.util.logging
) - 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。
- Apache见此,开发了
JCL
(Jakarta Commons Logging),即commons-logging-xx.jar
。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。 - 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出
slf4j
,它跟JCL类似,本身不替供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback
,一个比log4j拥有更高性能的组件,目的是为了替代log4j。 - Apache参考了logback,并做了一系列优化,推出了
log4j2
关系/依赖
大概了解心路历程后,再详细看看它们之间的关系、依赖。
JCL
commons-logging
已经停止更新,最后的状态如下所示:
JCL支持日志组件不多,不过也有很人用的,例如Spring 现在用的也越来越少了,也不多讲了
SLF4J
因为当时Java的日志组件比较混乱繁杂,Ceki Gülcü推出slf4j后,也相应为行业中各个主流日志组件推出了slf4j的适配 图来源于官方文档
图的意思为如果你想用slf4j作为日志门面的话,你如何去配合使用其他日志实现组件,这里说明一下(注意jar包名缺少了版本号,在找版本时也要注意版本之间是否兼容)
- slf4j + logback
slf4j-api.jar
+logback-classic.jar
+logback-core.jar
- slf4j + log4j
slf4j-api.jar
+slf4j-log4j12.jar
+log4j.jar
- slf4j + jul
slf4j-api.jar
+slf4j-jdk14.jar
- 也可以只用slf4j无日志实现
slf4j-api.jar
+slf4j-nop.jar
SLF4J的适配
slf4j支持各种适配,无论你现在是用哪种日志组件,你都可以通过slf4j的适配器来使用上slf4j。只要你切换到了slf4j,那么再通过slf4j用上实现组件,即上面说的。图来源于官方文档
其实总的来说,无论就是以下几种情况
- 你在用JCL 使用
jcl-over-slf4j.jar
适配 - 你在用log4j 使用
log4j-over-slf4j.jar
适配 - 你在用JUL 使用
jul-to-slf4j.jar
适配
我在网上盗一张图,给大家一个整体的依赖图(懒得画了)
让Spring统一输出
这就是为了对slf4j的适配做一个例子说明。Spring是用JCL作为日志门面的,那我们的应用是slf4j + logback,怎么让Spring也用到logback作为日志输出呢?这样的好处就是我们可以统一项目内的其他模块、框架的日志输出(日志格式,日志文件,存放路径等,以及其他slf4j支持的功能) 很简单,就是加入jcl-over-slf4j.jar
就好了。我又盗了一个图来说明
适配思路
其实很简单
- 你首先确认需要统一日志的模块、框架是使用哪个日志组件的,然后再找到sfl4j的适配器。
- 记得去掉无用的日志实现组件,只保留你要用的。
常见问题
slf4j的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。slf4j已经对错误作了说明官网说明下面讲一下可能经常遇到的问题
Failed to load class org.slf4j.impl.StaticLoggerBinder
没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。
Multiple bindings
找到多个日志实现,slf4j会找其中一个作为日志实现。
代码规范
阿里对此的代码规范:
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class);
总结
文章帮大家梳理了Java日志组件的关系,以及如何解决日常中常见日志相关的问题,希望对大家帮助。
清空运行中的jar 日志_Java日志体系权威总结相关推荐
- java sl4j 日志_Java日志框架Slf4j+Log4j入门
一.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志 ...
- curl 请求日志_Java 日志实践:简明配置、日志抽样和级别动态修改
广告平台的业务逻辑比较复杂,一次竞价请求,可能有几千个候选广告,最终的胜出者就那么几个.其他那些广告为什么没有曝光的机会呢? 经常被运营问这样的问题,而运营同学又往往是因为广告主问他们.如果没有一份详 ...
- app运行中的crash崩溃异常日志收集
转载来源http://blog.csdn.net/qq_17387361/article/details/52688998 在Android开发中,一个app在推广后.我们怎么才能知道这个app运行的 ...
- java 文件日志_Java日志记录-我的日志文件在哪里?
我在查找日志文件时遇到问题. 我java.util.logging在Windows XP的Eclipse 3.7.1中使用Java日志记录- .我logging.properties文件的相关行是: ...
- java报错 日志_java 日志报错
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-o ...
- java输出日志_java代码中如何正确使用loggger日志输出
java代码中如何正确使用loggger日志输出 发布时间:2019-06-28作者:spider阅读(2980) 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统, ...
- java tomcat 日志_java – 访问Tomcat中的详细日志
在 Eclipse中执行一个小应用程序时,我从Tomcat服务器收到Http Status 500错误,我在Eclipse中运行它- HTTP Status 500 - --------------- ...
- java log日志函数_Java 中的 AWS Lambda 函数日志记录 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. Ja ...
- java中info()_java日志中的info是啥意思
2019-03-21 回答 首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是 ...
最新文章
- 那些为“自主”的研发“
- VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)
- typedef 深入剖析
- java 队列实例_Java 实例 - 队列(Queue)用法
- MyEclipse安装JS代码提示(Spket插件)
- 平均年薪 70 万!刚刚,这类程序员又涨薪了!佩服!
- bzoj 1665: [Usaco2006 Open]The Climbing Wall 攀岩(最短路)
- 64. magento enable error report
- 网络安全传输(读书笔记)
- mfc窗口右下角如何显示一个三角形图案_以C4D制作金属碳笼为例:安利一个友好的三维制图软件...
- java 身份证地址提取籍贯_函数 | 身份证提取籍贯信息
- (转载)c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程
- 软件工程项目学生管理系统
- P18利用5次shift漏洞破解win7密码
- 四川2021年高考成绩位次查询,2021年填报志愿数据:四川所有本科大学近三年分数线、对应位次排行榜...
- 论AI在叮咚智能音箱中的演进和应用
- 经纬能源安全稳定怎样理财收益最大?怎样理财才干收益最大?
- 初中计算机课堂游戏设计,如何设计初中信息技术课堂作业
- 小组取什么名字好_生日日期做网名,取什么名字好?
- 电商平台分析平台----需求六:实时统计之黑名单机制
热门文章
- 当SQL Server爱上Linux:配置 SQL Server 2017 上的可用性组初体验
- 并发编程中,你加的锁未必安全
- 抵制羊毛党,图计算“加持”互联网电商风控
- 一个真正0基础小白学习前端开发的心路历程
- 划重点!DWS开发的五大要点
- 【响应式编程的思维艺术】 (2)响应式Vs面向对象
- php的floorval函数,php 取整函数(floor,ceil,round,intval)_PHP教程
- Matlab中矩阵编号方式以及一维二维三维数据间的相互转换
- YOLOv3使用自己数据集——Kmeans聚类计算anchor boxes
- 产生信号的代码10分类