Java日志框架介绍
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。
Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。
Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
Slf4j 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。
Logback 一套日志组件的实现(Slf4j阵营)。
Jul (Java Util Logging),自Java1.4以来的官方日志实现。
看了上面的介绍是否会觉得比较混乱,这些日志框架之间有什么异同,都是由谁在维护,在项目中应该如何选择日志框架,应该如何使用? 下文会逐一介绍。
Java常用日志框架历史
1996年早期,欧洲安全电子市场项目组决定编写它自己的程序跟踪API(Tracing API)。经过不断的完善,这个API终于成为一个十分受欢迎的Java日志软件包,即Log4j。后来Log4j成为Apache基金会项目中的一员。
期间Log4j近乎成了Java社区的日志标准。据说Apache基金会还曾经建议Sun引入Log4j到java的标准库中,但Sun拒绝了。
2002年Java1.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ü不适应Apache的工作方式,离开了Apache。然后先后创建了Slf4j(日志门面接口,类似于Commons Logging)和Logback(Slf4j的实现)两个项目,并回瑞典创建了QOS公司,QOS官网上是这样描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。
现今,Java日志领域被划分为两大阵营:Commons Logging阵营和Slf4j阵营。
Commons Logging在Apache大树的笼罩下,有很大的用户基数。但有证据表明,形式正在发生变化。2013年底有人分析了GitHub上30000个项目,统计出了最流行的100个Libraries,可以看出Slf4j的发展趋势更好:
java_populor_jar
Apache眼看有被Logback反超的势头,于2012-07重写了Log4j 1.x,成立了新的项目Log4j 2, Log4j 2具有Logback的所有特性。
java常用日志框架关系
Log4j 2与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j 1。
Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。Log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。
比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。
Logback必须配合Slf4j使用。由于Logback和Slf4j是同一个作者,其兼容性不言而喻。
Commons Logging与Slf4j实现机制对比
Commons Logging实现机制
Commons Logging是通过动态查找机制,在程序运行时,使用自己的ClassLoader寻找和载入本地具体的实现。详细策略可以查看commons-logging-*.jar包中的org.apache.commons.logging.impl.LogFactoryImpl.java文件。由于Osgi不同的插件使用独立的ClassLoader,Osgi的这种机制保证了插件互相独立, 其机制限制了Commons Logging在Osgi中的正常使用。
Slf4j实现机制
Slf4j在编译期间,静态绑定本地的Log库,因此可以在Osgi中正常使用。它是通过查找类路径下org.slf4j.impl.StaticLoggerBinder,然后在StaticLoggerBinder中进行绑定。
项目中选择日志框架选择
如果是在一个新的项目中建议使用Slf4j与Logback组合,这样有如下的几个优点。
Slf4j实现机制决定Slf4j限制较少,使用范围更广。由于Slf4j在编译期间,静态绑定本地的LOG库使得通用性要比Commons Logging要好。
Logback拥有更好的性能。Logback声称:某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在Logback中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的。
Commons Logging开销更高
# 在使Commons Logging时为了减少构建日志信息的开销,通常的做法是
if(log.isDebugEnabled()){
log.debug("User name: " +
user.getName() + " buy goods id :" + good.getId());
}
# 在Slf4j阵营,你只需这么做:
log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());
# 也就是说,Slf4j把构建日志的开销放在了它确认需要显示这条日志之后,减少内存和Cup的开销,使用占位符号,代码也更为简洁
Logback文档免费。Logback的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。
Slf4j用法
Slf4j与其它日志组件的关系说明
Slf4j的设计思想比较简洁,使用了Facade设计模式,Slf4j本身只提供了一个slf4j-api-version.jar包,这个jar中主要是日志的抽象接口,jar中本身并没有对抽象出来的接口做实现。
对于不同的日志实现方案(例如Logback,Log4j...),封装出不同的桥接组件(例如logback-classic-version.jar,slf4j-log4j12-version.jar),这样使用过程中可以灵活的选取自己项目里的日志实现。
Slf4j与其它日志组件调用关系图
slf4j-bind
Slf4j与其他各种日志组件的桥接说明
jar包名 说明
slf4j-log4j12-1.7.13.jar Log4j1.2版本的桥接器,你需要将Log4j.jar加入Classpath。
slf4j-jdk14-1.7.13.jar java.util.logging的桥接器,Jdk原生日志框架。
slf4j-nop-1.7.13.jar NOP桥接器,默默丢弃一切日志。
slf4j-simple-1.7.13.jar 一个简单实现的桥接器,该实现输出所有事件到System.err. 只有Info以及高于该级别的消息被打印,在小型应用中它也许是有用的。
slf4j-jcl-1.7.13.jar Jakarta Commons Logging 的桥接器. 这个桥接器将Slf4j所有日志委派给Jcl。
logback-classic-1.0.13.jar(requires logback-core-1.0.13.jar) Slf4j的原生实现,Logback直接实现了Slf4j的接口,因此使用Slf4j与Logback的结合使用也意味更小的内存与计算开销
具体的接入方式参见下图
slf4j-concrete-bindings1
Slf4j源码分析
slf4j-api-version.jar中几个核心类与接口
类与接口 用途
org.slf4j.LoggerFactory(class) 给调用方提供的创建Logger的工厂类,在编译时绑定具体的日志实现组件
org.slf4j.Logger(interface) 给调用方提供的日志记录抽象方法,例如debug(String msg),info(String msg)等方法
org.slf4j.ILoggerFactory(interface) 获取的Logger的工厂接口,具体的日志组件实现此接口
org.slf4j.helpers.NOPLogger(class) 对org.slf4j.Logger接口的一个没有任何操作的实现,也是Slf4j的默认日志实现
org.slf4j.impl.StaticLoggerBinder(class) 与具体的日志实现组件实现的桥接类,具体的日志实现组件需要定义org.slf4j.impl包,并在org.slf4j.impl包下提供此类,注意在slf4j-api-version.jar中不存在org.slf4j.impl.StaticLoggerBinder,在源码包slf4j-api-version-source.jar中才存在此类
Slf4j调用过程源码分析,只加入slf4j-api-version.jar,不加入任何实现包
示例代码
pom核心配置如下
<dependencies>
<!--只有slf4j-api依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
</dependencies>
程序入口类如下
slf4j-0
源码追踪分析
1)调用LoggerFactory的getLogger()方法创建Logger
slf4j-1-getLogger
2)调用LoggerFactory的getILoggerFactory方法来创建ILoggerFactory
slf4j-2-getILoggerFactory
3)调用LoggerFactory的performInitialization方法来进行初始化
slf4j-3-performInitialization
4)调用LoggerFactory的bind()方法
slf4j-4-bind
5)调用LoggerFactory的findPossibleStaticLoggerBinderPathSet()方法获取StaticLoggerBinderPath集合
slf4j-5-findPossibleStaticLoggerBinderPathSet
6)调用LoggerFactory的rep
相关文章:
Java日志框架介绍
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Glc首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。 Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。 Commons Logging Apache基金会所属的项目,是…...
编程中遇到的计算机大小端概念
概念大小端(Endian)是指在一个多字节的数据中,字节的存储顺序的规定。通俗来说,就是指数据在计算机内部存储时的顺序问题。在计算机系统中,一个数据项可能占据多个存储单元。在这种情况下,这个数据项的存储…...
日志与可视化方案:从ELK到EFK,再到ClickHouse
EFK方案 从ELK谈起 ELK是三个开源软件的缩写,分别表示:Elasticsearch,Logstash,Kibana。新增了一个FlieBeat,它是一个轻量级的日志收集处理工具,FlieBeat占用资源少,适用于在各个服务器上搜集…...
字符函数和字符串函数(上)——“C”
各位CSDN的uu们你们好呀,今天小雅兰来给大家介绍一个全新的知识点,就是字符函数和字符串函数啦,其实其中有些函数我之前已经学习过了,比如strlen、strcpy;也有一些之前不是很熟悉的函数,比如strstr、strtok…...
九龙证券|下周解禁市值超400亿元,3股解禁压力较大
下周3股解禁比例超50%。 百利电气昨日盘中直线拉升封板,至此,百利电气两连板,累计涨幅20.85%。 昨日晚间,百利电气发布股票交易反常动摇公告称,公司不触及“室温超导”相关业务,也未打开相关研发和投入。公…...
一个大型网站架构的演变历程
正序: Rome was not built in a day(罗马不是一天建成的。)一个成熟的大型网站从来都不是一蹴而就的,需要经过多次架构的调整和升级,我们熟知的大型网站比如京东、淘宝、亚马逊,它们每天都有巨大的用户访问…...
前端前沿web 3d可视化技术 ThreeJS学习全记录
前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能,但代码量大,难度大,需要掌握很多底层知识和数学知识 Threej…...
链表经典笔试题(LeetCode刷题)
本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳,希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...
SpringCloud五大组件
微服务SpringCloud整合技术组件基本流程: 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心,分为Eure…...
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
Echart? ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 ECharts 遵循 Apache-2.0 开源协议,免费商用。 ECharts 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome…...
聊聊腾讯T13技术专家被开除
这两天腾讯的技术大佬stonehuang被曝离开腾讯,据他老婆在小红书上发的帖子称是遭遇了裁员,说实话刚看到这个消息我挺震惊的,stonehuang在中国大前端领域是排得上号的专家,同时他2005年就加入了腾讯,在qq空间的发展历程…...
c++ 常见宏、模板用法【1】
目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...
【25】Verilog进阶 - 序列检测
VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...
如何绕开运营商的 QoS 限制
运营商针对 UDP 进行限制,这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一,上了线很多问题,丢包,慢等的问题严重增加运维,运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则,只要换一个端口就可…...
C#基础教程22 异常处理
文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...
java八股文--java基础
java基础1.什么是面向对象,谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第四套解析(详细)
2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (4) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...
【Spark】spark使用jdbc连接带有kerberos认证的hive jdbc
背景 这个需求就是spark不通过spark-hive的方式访问hive数据,而是通过spark读取hive jdbc的方式访问hive数据,因为这个hive有kerberos认证,在网上也不是很容易搜索到这样的操作案例。不多bb,直接上教程。 准备工作 准备一个hiv…...
【Maven】项目中pom.xml坐标定义以及pom基本配置
目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标,内容包括:groupId、artifactId、version,详细内容如下: <!--项目名称,定义为组织名项目名,类似包名-->&l…...
Linux GCC 编译详解
文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介 首先,什么是编译器呢? 我们可以使用编辑器(如 linux 下的 vi、windows 下…...
谁说程序员不懂了浪费,女神节安排
Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好,我是ζ小菜鸡,特在这个特殊的日子献上此文,希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐,…...
上市公司管理层短视指标(2007-2020)
1、数据说明:将研发⽀出的减少量(∆R&D)作为管理层短视⾏为的度量指标,即∆R&D为公司t年的研发⽀出减去t-1年的研发⽀出并除以t-1年末的总资产再乘以100。2、数据来源:自主整理3、时间跨度:2007-20…...
IDDPM 和 DDIM 对比
IDDPM 和 DDPM 对比IDDPMDDIMIDDPM IDDPM:Improved Denoising diffusion probabilistic models learning Σθ\Sigma_{\theta}Σθ, 即Σθ(xt,t)exp(vlogβt(1−v)logβ~t)\Sigma_{\theta}\left(x_{t}, t\right)\exp \left(v \log \beta_{t}(1…...
链表OJ题(上)
✅每日一练:876. 链表的中间结点 - 力扣(LeetCode) 解题思路: 定义快慢指针,让快指针走2步,慢指针走1步,当fast或者fast.next为空时,走完链表,此时slow就是中间位置 pub…...
【题解】百度2021校招Web前端工程师笔试卷(第一批):单选题、多选题
题目来源:牛客网公司真题_免费模拟题库_企业面试|笔试真题 (nowcoder.com) 若有错误请指正! 单选题 1 某主机的 IP 地址为 212.212.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是&…...
论文解读:SuperPoint: Self-Supervised Interest Point Detection and Description
发表时间: 2018年 项目地址:https://arxiv.org/abs/1712.07629 论文地址:https://github.com/magicleap/SuperPointPretrainedNetwork 本文提出了一种用于训练计算机视觉中大量多视点几何问题的兴趣点检测器和描述符的自监督框架。与patch-based的神经网…...
游戏玩的多,陪玩你了解的多吗?用Python来采集陪玩数据,看看行情和美照
前言 (。・∀・)ノ゙嗨 大家好 现在应该每个人都玩过游戏吧,有些的上瘾,天天玩停不下来,有些的倒是没啥感觉 有游戏就肯定有陪玩啊,毕竟当朋友忙的时候,自己一个…...
React框架创建项目详细流程-项目的基本配置-项目的代码规范
文章目录React创建项目流程与规范项目规范项目配置目录结构样式重置Router配置Redux状态管理axios配置React创建项目流程与规范 项目规范 项目规范: 在项目中都会有一些开发规范和代码风格, 下面介绍一下我采用的规范与风格 文件夹、文件名称统一小写、多个单词以连接符(-)连…...
nnunet入门之一 (CT图像分割)
目录安装环境数据处理预处理训练测试MIC-DKFZ/nnUNet 选择Linux环境运行该项目,Windows环境需要更改较多的参数,暂不支持。 安装环境 安装cuda, cudnn,已安装的检测cuda版本 检测cuda版本: nvcc -v cd /usr/local nvidia-smi&…...
从0到1_批量下载视频
简介:真实从0到1,童叟无欺~ 目标:用python批量下载搜索视频,以“CG 服装”为例 搜索图片就不放啦,不能过审 本章主要介绍如何用python把搜索到的视频直接下载到自己的本地文件夹中~ 介绍一下工作…...
建筑工程网签备案合同/西安seo代理计费
leetcode415题字符串相加 进位求和 字符串的拼接 想起来一个将数字反转的题目,简单说一下思路吧, carry num % 10 num num / 10 res carry * 10 class Solution {public String addStrings(String num1, String num2) {//说实话,这种思路还是有点东西的StringBuilder…...
安徽省建设质量安全协会网站/北京网站优化步骤
/* index1 45 index2 36 index3 231 index4 43 index5 100 index6 123 index7 51**通过读取读取c.txt文件内容中等号右值,并将右值最大值,最小值和平均值打印到屏幕。*/ #include <stdio.h> #include <stdlib.h> #include <string…...
八桂云网站建设/已矣seo排名点击软件
2019独角兽企业重金招聘Python工程师标准>>> 安装gcc sudo apt-get install gcc 安装gcc-c 的编译环境 sudo apt-get install build-essential 安装pcre cd pcre-version ./configure make sudo make install 安装zlib cd zlib-version ./configure make sudo make…...
东莞网站设计实力/如何学会推广和营销
我觉得自己的目标很混乱,总是看这个又看那个.虽说这个习惯不好,可是也增加了许多见识.今天尝试编写内核模块,写了一个hello,world,结果弄了1个小时。主要参考了网上的人的说明,结果发现尽信书不如无书,很多人说的都不是很仔细,我觉得这对于初…...
网站建设审批/北京seo专员
满意答案yiguo1987推荐于 2016.05.28采纳率:45% 等级:12已帮助:7472人Linux下大部分驱动都是以模块方式加载到内核的,要删除一个驱动,主要从模块下手。所以首先要学会如何查看已经加载的模块:lsmod第一列…...
app推广方式有哪些/南京seo排名优化公司
最近家里杂事较多,自学时间实在少的可怜,所以都在空闲时间看看老外写的内容,学习之外顺便翻译分享~等学习的时间充足些再写写自己的一些学习内容和知识点分析(最近有在接触的:复习(C#,SQL)、(学习)TypeScriptÿ…...