简朴回首门面模式
slf4j是门面模式的典范应用,因此在讲slf4j前,我们先简朴回首一下门面模式,
门面模式,其焦点为外部与一个子系统的通信必需通过一个统一的外观工具举办,使得子系统更易于利用。用一张图来暗示门面模式的布局为:
苏州软件公司 slf4j不提供日志的详细实现" src="http://www.importnew.com/https:/images2018.cnblogs.com/blog/801753/201803/801753-20180321204740208-1670144043.png" />
门面模式的焦点为Facade即门面工具,门面工具焦点为几个点:
大抵上来看,对门面模式的回首到这里就可以了,开始接下来对SLF4J的进修。
我们为什么要利用slf4j
我们为什么要利用slf4j,举个例子:
我们本身的系统中利用了logback这个日志系统 我们的系统利用了A.jar,A.jar中利用的日志系统为log4j 我们的系统又利用了B.jar,B.jar中利用的日志系统为slf4j-simple 这样,我们的系统就不得差异时支持并维护logback、log4j、slf4j-simple三种日志框架,昆山软件公司,很是未便。
办理这个问题的方法就是引入一个适配层,由适配层抉择利用哪一种日志系统,而挪用端只需要做的工作就是打印日志而不需要体贴如何打印日志,slf4j可能commons-logging就是这种适配层,slf4j是本文研究的工具。
从上面的描写,我们必需清楚地知道一点:slf4j只是一个日志尺度,并不是日志系统的详细实现。领略这句话很是重要,slf4j只做两件工作:
slf4j-simple、logback都是slf4j的详细实现,log4j并不直接实现slf4j,可是有专门的一层桥接slf4j-log4j12来实现slf4j。
为了更领略slf4j,我们先看例子,再读源码,相信读者伴侣会对slf4j有更深刻的认识。
slf4j应用举例
上面讲了,昆山软件开发,slf4j的直接/间接实现有slf4j-simple、logback、slf4j-log4j12,我们先界说一个pom.xml,引入相关jar包:
<!-- 原文:五月的仓颉http://www.cnblogs.com/xrq730/p/8619156.html --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.xrq.log</groupId> <artifactId>log-test</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>log-test</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> </dependencies> </project>
写一段简朴的Java代码:
1 @Test 2 public void testSlf4j() { 3 Logger logger = LoggerFactory.getLogger(Object.class); 4 logger.error("123"); 5 }
接着我们首先把上面pom.xml的第30行~第49行注释掉,即不引入任何slf4j的实现类,运行Test要领,我们看一下节制台的输出为:
苏州软件公司 slf4j不提供日志的详细实现" src="http://www.importnew.com/https:/images2018.cnblogs.com/blog/801753/201803/801753-20180322210329212-109853098.png" />
看到没有任何日志的输出,这验证了我们的概念:slf4j不提供日志的详细实现,只有slf4j是无法打印日志的。
接着打开logback-classic的注释,运行Test要领,我们看一下节制台的输出为:
苏州软件公司 slf4j不提供日志的详细实现" src="http://www.importnew.com/https:/images2018.cnblogs.com/blog/801753/201803/801753-20180322210559779-329522420.png" />
看到我们只要引入了一个slf4j的详细实现类,即可利用该日志框架输出日志。
最后做一个考试,我们把所有日志打开,引入logback-classic、slf4j-simple、log4j,运行Test要领,节制台输出为:
苏州软件公司 slf4j不提供日志的详细实现" src="http://www.importnew.com/https:/images2018.cnblogs.com/blog/801753/201803/801753-20180322210821802-131238582.png" width="1097" height="150" />
和上面的不同是,可以输出日志,可是会输出一些告警日志,提示我们同时引入了多个slf4j的实现,然后选择个中的一个作为我们利用的日志系统。