log4j jdbc sql 带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
log4j jdbc sql 带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J

最近系统被扫出来还在使用老旧的log4j,需要升级到最新的log4j。但是在升级的发现,Java相关的日志处理库有log4j, ,slf4j和,初一看确实有点头大,那么区别是啥呢?之前也大概知道一些,查找了大量相关资料,这里好好总结一下,相信你读完就会熟练掌握
Log4J、和的历史故事
使用过Log4J和的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,Ceki Gülcü,俄罗斯程序员。
Log4J 最初是基于Java开发的日志框架,发展一段时间后,作者Ceki Gülcü将Log4j捐献给了软件基金会,使之成为了日志服务的一个子项目。 又由于Log4J出色的表现,后续又被孵化出了支持C, C++, C#, Perl, , Ruby等语言的子框架。
然而,伟大的程序员好像都比较有个性。Ceki Gülcü由于不满对Log4J的管理,决定不再参加Log4J的开发维护。“出走”后的Ceki Gülcü另起炉灶,开发出了这个框架(SLF4J是和一起开发出来的)。改进了很多Log4J的缺点,在性能上有了很大的提升,同时使用方式几乎和Log4J一样,许多用户开始慢慢开始使用。
由于受到的冲击,Log4J开始式微。终于,2015年9月,软件基金业宣布,Log4j不在维护,建议所有相关项目升级到。是开发的一个新的日志框架,改进了很多Log4J的缺点,同时也借鉴了,号称在性能上也是完胜。性能这块后面我会仔细分析。
那slf4j和这些有什么关系?
SLF4J的全称是 for Java,slf4j是门面模式的典型应用,因此在讲slf4j前,需要简单介绍下门面模式。
看看门面模式再说
下面是门面模式的一个典型调用过程,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。 下图中客户端不需要直接调用几个子系统log4j jdbc sql,只需要与统一的门面进行通信即可。

门面模式的核心为即门面对象,核心为几个点:
为什么要使用slf4j ?
回答这个问题之前,我们先看看如果需要用上面几个日志框架来打印日志,一般怎么做,具体代码如下:
// 使用log4j,需要log4j.jar
import org.apache.log4j.Logger;
Logger logger_log4j = Logger.getLogger(Test.class);
logger_log4j.info("Hello World!");
// 使用log4j2,需要log4j-api.jar、log4j-core.jar
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Logger logger_log4j2 = LogManager.getLogger(Test.class);
logger_log4j2.info("Hello World!");
// logback,需要logback-classic.jar、logback-core.jar
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
Logger logger_logback = new LoggerContext().getLogger(Test.class);
logger_logback.info("Hello World!");
从上面不难看出,使用不同的日志框架,就要引入不同的jar包,使用不同的代码获取。如果项目升级需要更换不同的框架log4j jdbc sql,那么就需要修改所有的地方来获取新的,这将会产生巨大的工作量。
基于此,我们需要一种接口来将不同的日志框架的使用统一起来,这也是为什么要使用slf4j的原因。
SLF4J,即简单日志门面( for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单,允许最终用户在部署其应用时使用其所希望的日志系统。
注意:类似的日志门面还有 (JCL),主要区别在于,SLF4J是一个比较新的日志框架,它更加灵活,性能更好,支持更多的日志实现,而且JCL基于在运行时动态加载日志框架,可能会产生很多意想不到的安全问题,关于这个问题可以参考讨论
通过上面的介绍,我们可以知道JCL和SLF4J都是日志门面(),而Log4J、和都是子系统角色(),也就是具体的日志实现框架。他们的关系如下,JUL是JDK本身提供的一种实现。

使用日志门面引入日志组件的最大优势是:将系统和具体的日志实现框架解耦合。
slf4j怎么和日志框架结合使用?
使用slf4j后,当我们在打印日志时,就可以使用下面的方式:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("Hello World!")
这又引入了另外一个问题,slf4j如何决定使用哪个框架日志呢,并且引入哪些jar包呢?官方为我们准备了下面的组合依赖结构图:

总结来说,就是一下几种:
注意到这里没有依赖jar的关系,和配合需要导入的log4j-api.jar、log4j-core.jar和桥接包log4j-slf4j-impl.jar。
所谓的桥接包,就是实现类,用来连接slf4j和日志框架。因为log4j和刚开始没有这个类,为了不改变程序结构,只能重新写一个新的jar来实现。而出现slf4j之后,于是在本身的jar中实现了,所以就不需要桥接包。
现在为什么推荐?
Log4j 2 是 Log4j(1) 的升级版,比它的祖先 Log4j 1.x和 有了很大的改进。除了内部设计的调整外,主要有以下几点的大升级:
中,分为 API(log4j-api)和实现 (log4j-core) 两个模块。API 和 slf4j 是一个类型,属于日志抽象 / 门面,而实现部分,才是 Log4j 2 的核心。
在目前 JAVA 中的日志框架里,异步日志的性能是最高的,具体可以看下面的对比图:

采用了字符串复用等手段来实现零GC模式运行,另外提供了nder实现了极高的IO性能,而且API相比slf4j,有更丰富的参数格式化功能。
怎么使用?
说了半天,那怎么去使用呢,这部分我仔细介绍一下。
常规使用步骤
下面以Maven配置为例进行介绍。
首先需要加入log4j的依赖,注意2.17.1以下的版本会有远程代码执行的安全漏洞,具体参考官方文档推荐使用最新的版本。
org.apache.logging.log4j
log4j-api
2.17.2
org.apache.logging.log4j
log4j-core
2.17.2
配置好.xml配置文件,并放到项目的里面,一般会放到目录里面。下面是一个参考的配置,当然也可以使用文件和yaml文件来进行配置。
在程序中打印log。使用下面的方式来打印log即可。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class HelloWorld {
private static final Logger logger = LogManager.getLogger(HelloWorld.class);
public static void main(String[] args) {
logger.debug("Hello from Log4j 2");
// in old days, we need to check the log level to increase performance
/*if (logger.isDebugEnabled()) {
logger.debug("{}", getNumber());
}*/
// with Java 8, we can do this, no need to check the log level
logger.debug("{}", () -> getNumber());
}
static int getNumber() {
return 5;
}
}
输出如下:
19:12:25.337 [main] DEBUG com.malaoshi.HelloWorld - Hello from Log4j 2
19:12:25.340 [main] DEBUG com.malaoshi.HelloWorld - 5
配置文件详解
首先给大家看一个比较全面的配置文件log4j jdbc sql,可能看起来比较头大log4j jdbc sql 带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J,不急我后面会一点点仔细分析。
下面为大家仔细解析这个配置文件,
1. 根节点

有两个属性:和,有两个子节点:和(表明可以定义多个和)。
2. 节点
节点,常见的子节点有:、、File。
节点用来定义输出到控制台的。
File节点用来定义输出到指定位置的文件的。
节点用来定义超过指定大小自动删除旧的创建新的的。
olicy:子节点,基于时间的滚动策略,属性用来指定多久滚动一次,默认是1 hour。=true用来调整时间:比如现在是早上3amlog4j jdbc sql 带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J,是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am。 olicy:子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。
3.
节点,常见子节点有:Root和。
Root节点用来指定项目的根日志,如果没有单独指定,那么就会默认使用该Root日志输出
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
4. 日志Level
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
参考范例
这部分给大家提供几个常用的配置,直接放到项目里面改一下包名就可以用。
1. 输出日志到
2. 输出日志到文件
%d %p %c{1.} [%t] %m%n
3. 输出到文件并滚动生成新的日志文件
%d %p %c{1.} [%t] %m%n
以上就是所有的内容,看完下来就会搞清楚各种log框架的关系,以及如何在项目中使用这些log框架。
参考:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » log4j jdbc sql 带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

