无锡餐饮网站建设,php网站建设找哪家好,备案成功后怎么建网站,国外企业网站怎么做原文链接
日志框架发展历程
在了解日志框架时总会列出一系列框架#xff1a;Log4j#xff0c;Reload4j#xff0c;JUL#xff0c;JCL#xff0c;SLF4J#xff0c;Logback#xff0c;Log4j2#xff0c;这么多框架让人感到混乱#xff0c;该怎么选取、该怎么用。接下来…原文链接
日志框架发展历程
在了解日志框架时总会列出一系列框架Log4jReload4jJULJCLSLF4JLogbackLog4j2这么多框架让人感到混乱该怎么选取、该怎么用。接下来让我们逐步理清这些框架及之间的关系。
首先来了解日志框架的发展历程就能大致清楚这些框架之间的关联和区别。 1996 年Log4j 开始出现并成为一个流行的 Java 日志记录包后来贡献给 Apache 基金会但在 2015 年宣布不在维护了。 reload4j 是 Apache log4j 版本 1.2.17 的一个分支旨在解决 log4j 的安全问题。Reload4j 是log4j 版本 1.2.17 的直接替代品所以想继续使用 log4j 1.x 的框架推荐使用 slf4j-reload4j 进行替代。 2002 年 Java 1.4 发布同时推出自己的日志库 JULJava Util Logging。Apache 曾建议 sun 公司 将 Log4j 引入到 jdk 中但被拒绝了sun 公司仿照 Log4j实现一套自己的日志实现框架即 JUL。 同时Apache 推出了 JCLJakarta Commons Logging一个简单的日志门面框架它提供了一套统一的日志接口解决 Java 应用程序中使用不同日志框架导致的代码依赖问题其内部提供了一个 Simple Log 简单日志实现支持集成使用 Log4j、jdk 1.4JUL等具体日志实现。 JCL最初是由Apache软件基金会的Jakarta 项目组开发的当时它是 Apache Jakarta 项目的一部分。在2011年Jakarta 项目组重新组织并成为 Apache Commons 项目。因此JCL 目前被称为 Apache Commons Logging。 2006年log4j 的作者又发布了 SLF4JSimple Logging Facade for Java是一个简单的日志门面框架旨在提供统一的日志API解决 Java 应用程序中使用不同日志框架导致的代码依赖问题。它比 Apache Commons LoggingJCL见简单、稳定支持集成各种日志实现框架Jul、log4j 1.x、reload4j 和 Logback。 同时SLF4J 的作者顺带推出了 Logback 日志实现框架。 2014年Apache 发布了 Log4j2是 log4j 的官方升级版。
综上
日志门面技术规范JCL、SLF4J日志实现框架Log4j 、JUL、Logback、Log4j2。
Log4j
Log4j 介绍
Log4j 有三个主要的组件日志记录器Logger日志输出目标Appenders和日志格式化器Layouts。 日志记录器LoggerLogger 组件在此系统中被分为五个级别DEBUG、INFO、WARN、ERROR 和 FATAL。这五个级别是有顺序的DEBUG INFO WARN ERROR FATAL分别用来指定这条日志信息的重要程度只输出级别不低于设定级别的日志信息假设 Logger 级别设定为 INFO则INFO、WlARN、 ERROR 和 FATAL 级别的日志信息都会输出而级别比 INFO 低的 DEBUG 则不会输出。 日志输出目标Appender日志输出目标定义了日志消息的输出位置。Log4j 提供了多个内置的输出目标如控制台、文件、数据库等。开发人员可以根据需要配置一个或多个输出目标来将日志消息输出到不同的位置。 常使用的类如下 org.apache.log4j.ConsoleAppender输出到控制台org.apache.log4j.FileAppender输出到文件org.apache.log4j.DailyRollingFileAppender每天产生一个日志文件org.apache.log4j.RollingFileAppender日志文件到达指定大小的时候产生一个新的日志文件org.apache.log4j.WriterAppender将日志信息以流格式发送到任意指定的地方 日志格式化器Layout日志格式化器定义了日志消息的输出格式。Log4j 提供了多个内置的格式化器如简单文本格式、HTML格式、XML格式、自由指定样式等。开发人员可以根据需要选择适当的格式化器来控制日志消息的输出样式。 常使用的类如下 org.apache.log4j.HTMLLayout以HTML表格形式布局org.apache.log4j.PatternLayout可以灵活地指定布局模式org.apache.log4j.SimpleLayout包含日志信息的级别和信息字符串org.apache.log4j.TTCCLayout包含日志产生的时间、线程、类别等信息
Log4j 配置文件
Log4j 使用一个配置文件来指定日志记录器、输出目标、格式化器等的配置信息。在实际应用中在 使用 Log4j 之前先设置配置文件。配置文件事实上也就是对 Logger、Appender 及 Layout 进行相应设置。Log4j 支持两种配置文件格式一种是 XML 格式的文件一种是 properties 属性文件。下面是以 xml 属性文件的配置示例
?xml version1.0 encodingUTF-8?
!DOCTYPE log4j:configuration SYSTEM log4j.dtdlog4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/appender nameConsoleAppender classorg.apache.log4j.ConsoleAppender!-- 设置日志输出位置 --param nameTarget valueSystem.out /!-- 设置日志输出格式 --layout classorg.apache.log4j.PatternLayoutparam nameConversionPattern value%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5p %c{1} : %m%n //layout/appender!-- 指定包下的日志输出级别 --
!-- logger namecom.jcl.demo--
!-- level valueerror/--
!-- /logger--!-- 配置所有包下的日志输出级别, 除了 logger 指定的包--rootpriority valueinfo /appender-ref refConsoleAppender //root/log4j:configurationLog4j 使用示例 引入依赖 dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.12/version
/dependency按照上面 Log4j 设置配置文件 代码示例 import org.apache.log4j.Logger;
import org.junit.Test;public class Log4jTest {Testpublic void Log4jTest() {Logger log Logger.getLogger(Log4jTest.class);log.info(info日志打印);log.error(error日志打印);}
}JULJava Util Logging
JUL 介绍
JUL 是 Java 1.4 版本自带的日志框架JUL的核心组件是java.util.logging包中的类和接口。Logger是最重要的类用于创建和管理日志记录器。Handler用于定义日志消息的输出目的地如控制台、文件等。Formatter定义了日志消息的格式。Level表示日志的级别JUL定义了七个日志级别从低到高分别是ALL、FINEST、FINER、FINE、CONFIG、INFO、WARNING、SEVERE、OFF。
JUL的默认配置是通过配置文件logging.properties进行的。
JUL 使用示例 Java 核心包所以无需引入其他依赖 配置 logging.properties 文件设置日志相关信息不配置取默认设置。 Java 代码示例 import org.junit.Test;
import java.util.logging.Logger;public class JulTest {Testpublic void testLog(){Logger log Logger.getLogger(com.jcl.demo.JulTest);log.info(info日志打印);}
}JCLJakarta Commons Logging
JCL 介绍
JCLJakarta Commons Logging一个简单的日志门面技术它提供了一套统一的日志接口通过集成不同的日志实现框架来处理日志记录。JCL 是 Apache 中的项目。
前面介绍了 Log4j 和 JUL 日志实现框架使用两种框架需要分别定义不同框架下的类随着框架或者业务发展有时需要使用或替换不同的日志实现框架这时业务代码中的日志实现是深度耦合的开发人员修改替换使用的日志类非常麻烦。于是出现了日志门面框架就是提供一系列通用接口规范在业务代码中统一使用日志门面框架提供的接口日志处理操作交由引入的具体日志实现框架来实现。这就好比 JDBC 数据库驱动统一调用 JDBC 的接口具体处理方式由引入的具体驱动包来实现。这样在更换日志实现框架时不需要修改业务代码解耦特定的日志实现。
JCL 使用示例 JCL 是 Apache 中的项目所以需要引入依赖包 dependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version
/dependency若没有引入其他日志实现框架默认使用 Java 1.4 自带的日志框架JUL若使用 Log4j 日志实现框架引入相关依赖配置 log4j.xml。 代码使用示例可以看到业务代码使用日志门面框架中的接口类具体日志处理交由对应的日志实现框架处理这样在更换日志实现框架时不需要修改业务代码只需要对相关日志实现框架进行相应配置即可。 import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;public class JclTest {Testpublic void testLog(){Log log LogFactory.getLog(JclTest.class);log.info(info日志打印);log.error(error日志打印);}
}Logback
logback 使用示例 引入依赖这个包依赖了 slf4j-api所以是 slf4j logback 的形式。 dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.12/version
/dependency配置 logback.xml configurationappender nameCONSOLE classch.qos.logback.core.ConsoleAppenderencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n/pattern/encoder/appenderroot levelinfoappender-ref refCONSOLE //root
/configuration代码使用示例 import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LogbackTest {Testpublic void Log4jTest() {Logger log LoggerFactory.getLogger(LogbackTest.class);log.info(info日志打印);log.error(error日志打印);}
}SLF4JSimple Logging Facade For Java
SLF4J 介绍
SLF4J 也是一个日志门面框架即简单日志门面Simple Logging Facade For Java主要是为了提供一套标准、规范的日志接口具体的实现交由其他日志实现框架。
参考官网SLF4J 可以集成使用以下不同的日志实现框架
slf4j-api.jar 包这是使用 SLF4J 接口需要使用的 jar 包只引入该 jar 包使用时会提示没有提供日志实现默认会去使用 slf4j-nop 日志实现框架一种无操作的日志记录机制。slf4j-nop.jar 包这是 SLF4J 的一个日志实现它实际上是一个空操作的日志记录器。当应用程序使用slf4j-nop作为日志框架时所有的日志操作都将被忽略不会有任何实际的日志输出。slf4j-simple.jar 包这是 SLF4J 的一个简单日志实现它提供了一个轻量级的日志记录器适用于简单的应用程序和测试环境。logback-classic.jar logback-core.jar 包logback-core是Logback框架的一个核心模块作为logback-classic的基础组件之一它提供了Logback框架的核心功能和基本组件logback-classic 是 Logback 框架的一个核心模块它建立在logback-core之上提供了与log4j兼容的API并且是log4j的继任者。实际引入 logback-classic 包即可该包中引入了 logback-core 包。reload4j.jar slf4j-reload4j.jar 包reload4j 是 log4j 的一个扩展版本slf4j 需要使用这个三方日志实现框架需要使用 slf4j-reload4j 适配器桥接器即 slf4j —— slf4j-reload4j —— reload4j。JUL slf4j-jdk14.jar 包JUL 是 Java 1.4 自带的的日志实现框架slf4j 集成这个日志实现框架使用同样需要引入 slf4j-jdk14 适配器桥接器即 slf4j —— slf4j-jdk14 —— JUL。 深灰色框表示需要引入的 jar 包如slf4j-api.jar浅蓝色框表示slf4j日志门面框架深蓝色框表示slf4j本地的日志实现框架绿色框表示需要使用的适配器浅灰色框表示其他的日志实现框架
SLF4J 使用示例 引入 SLF4J 依赖 dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.36/version
/dependency需要引入日志实现框架依赖包否则默认使用 slf4j-nopslf4j 本地的日志实现。 使用 slf4j-nop 日志实现不输出任何日志即忽略日志 dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-nop/artifactIdversion1.7.36/version
/dependency使用 reload4j 日志实现需要引入桥接器配置 log4j.xml !-- 桥接器 --
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-reload4j/artifactIdversion1.7.36/version
/dependency
!-- reload4j 日志实现框架 --
dependencygroupIdch.qos.reload4j/groupIdartifactIdreload4j/artifactIdversion1.2.25/version
/dependency使用 jul 日志实现jul java 自带不需要引入包但需要引入桥接器 !-- jul 日志实现需要引入的桥接器 --
dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-jdk14/artifactIdversion1.7.36/version
/dependency使用 logback 日志实现配置 logback.xml !-- logback 日志实现, slf4j 本地的日志实现, logback-classic 包中包含 logback-core --
dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.12/version
/dependency使用 log4j2 日志实现配置 log4j2.xml !-- 使用 Log4j2 日志实现框架 --
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.17.1/version
/dependency
!-- 桥接器 --
dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-slf4j-impl/artifactIdversion2.17.1/version
/dependency代码使用示例 import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Slf4jTest {Testpublic void Log4jTest() {Logger log LoggerFactory.getLogger(Slf4jTest.class);log.info(info日志打印);log.error(error日志打印);}
}Log4j2
Log4j2 是 Log4j 的升级版。
logback 使用示例 引入依赖这个包依赖了 slf4j-api所以是 slf4j logback 的形式。 dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.17.1/version
/dependency配置 logback.xml ?xml version1.0 encodingUTF-8?
Configuration statusWARNAppendersConsole nameConsole targetSYSTEM_OUTPatternLayout pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n //Console/AppendersLoggersRoot levelinfoAppenderRef refConsole //Root/Loggers
/Configuration代码使用示例 import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;public class Log4j2Test {Testpublic void Log4jTest() {Logger log LogManager.getLogger(Log4j2Test.class);log.info(info日志打印);log.error(error日志打印);}
} 日志框架梳理Log4jReload4jJULJCLSLF4JLogbackLog4j2