【1】log4j框架
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2015年5月,Apache宣布log4j1.x 停止更新。最新版为1.2.17。
pom依赖:
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
【2】log4j2框架
Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。
Log4j的API与实现分开,使应用程序开发人员可以清楚地了解可以使用哪些类和方法,同时确保向前兼容性。这使Log4j团队能够以安全且兼容的方式进行改进。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <log4j2.version>2.16.0</log4j2.version> </properties> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency>
SpringBoot项目中使用log4j2:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除spring boot默认日志logback --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
【3】slf4j门面
SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:提供日志接口,提供获取具体日志对象的方法。
slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。
它只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口,并没有实现,所以如果要使用就得再给它提供一个实现了些接口的日志包,比 如:log4j,logback日志实现包等,但是这些日志实现又不能通过接口直接调用,实现上他们根本就和slf4j-api不一致,因此slf4j又增加了一层来转换各日志实 现包的使用,比如slf4j-log4j12等。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- SLF4J LOG4J 12 Binding --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency> <!-- JCL 1.2 Implemented Over SLF4J --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.14</version> </dependency> <!-- JUL to SLF4J Bridge --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.32</version> </dependency>
slf4j-log4j12
当想使用slf4j+log4j这对组合时,你需要引入slf4j-log4j12这个适配器。
【4】Java.util.logging框架
Java 中的 Logging API 让 Java 应用可以记录不同级别的信息,它在debug过程中非常有用,如果系统因为各种各样的原因而崩溃,崩溃原因可以在日志中清晰地追溯,下面让我们来看看 Java 原生的 Logging 功能。
从1.4.2开始,Java 通过 Java.util.logging 包为应用程序提供了记录消息的可能,在 API 中的核心类为 Logger 类。理解在记录消息中的日志的不同级别是非常重要的。Java 为此定时了8个级别,它们是分别SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST 以及 ALL. 它们按照优先级降序排列,在应用运行的任何时间点,日志级别可以被更改。
通常来说,当为 Logger 指定了一个 Level, 该 Logger 会包含当前指定级别以及更高级别的日志。举例而言,如果 Level 被设置成了 WARNING, 所有的 warning 消息以及 SERVER 消息会被记录。应用可以用下列方法记录日志:Logger.warning(), Logger.info(), Logger.config() …
【5】logback框架
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。
logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
pom依赖:
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.8</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.8</version> </dependency> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-access --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.8</version> </dependency>
【6】Jakarta Commons logging门面
JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging",是Apache提供的一个通用日志API。JCL采用了设计模式中的“适配器模式”,它是为“所有的Java日志实现”提供的一个统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,它自身也提供一个日志的实现,但是功能非常弱(SimpleLog)。所以一般不会单独使用它。它允许开发人员使用不同的具体日志实现工具:Log4j,jdk自带的日志(JUL)
pom文件
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
【7】JBoss Logging 门面
是一款类似于slf4j的门面,本身不提供实现通常与log4j等具体日志框架集成。
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging --> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.4.2.Final</version> </dependency>
【8】log4j2修复
Apache Log4j 远程代码执行漏洞,严重程度: 严重。
由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行。漏洞利用无需特殊配置
情况分析:
Apache Log4j是一个基于Java的日志记录组件。Apache Log4j2是Log4j的升级版本,通过重写Log4j引入了丰富的功能特性。该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
受影响的版本:
Apache log4j2 2.0 - 2.14.1 版本均受影响。涉及的代码包为:org.apache.logging.log4j:log4j-api 与 org.apache.logging.log4j:log4j-core。
如果项目使用了maven,可能如下所以,这里我们可以修复为最新版本2.16.0
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.16.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.16.0</version> </dependency> <depe
如果是springboot项目,则更简单,直接做如下配置即可:
<properties> <java.version>1.8</java.version> <log4j2.version>2.16.0</log4j2.version> </properties>
这和springboot的依赖管理有关。如下图所示,在spring-boot-starter-parent的pom中有spring-boot-dependencies:
这里我们干脆放出来完整的spring-boot-dependencies 的pom 文件,如下所示其维护了诸多子依赖的版本,那么我们在外层定义<log4j2.version>2.16.0</log4j2.version>,就可以告诉springboot使用我们指定的版本。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> <packaging>pom</packaging> <name>spring-boot-dependencies</name> <description>Spring Boot Dependencies</description> <properties> <activemq.version>5.15.13</activemq.version> <antlr2.version>2.7.7</antlr2.version> <appengine-sdk.version>1.9.82</appengine-sdk.version> <artemis.version>2.12.0</artemis.version> <aspectj.version>1.9.6</aspectj.version> <assertj.version>3.16.1</assertj.version> <atomikos.version>4.0.6</atomikos.version> <awaitility.version>4.0.3</awaitility.version> <bitronix.version>2.1.4</bitronix.version> <build-helper-maven-plugin.version>3.1.0</build-helper-maven-plugin.version> <byte-buddy.version>1.10.14</byte-buddy.version> <caffeine.version>2.8.5</caffeine.version> <cassandra-driver.version>4.6.1</cassandra-driver.version> <classmate.version>1.5.1</classmate.version> <commons-codec.version>1.14</commons-codec.version> <commons-dbcp2.version>2.7.0</commons-dbcp2.version> <commons-lang3.version>3.10</commons-lang3.version> <commons-pool.version>1.6</commons-pool.version> <commons-pool2.version>2.8.1</commons-pool2.version> <couchbase-client.version>3.0.8</couchbase-client.version> <db2-jdbc.version>11.5.4.0</db2-jdbc.version> <dependency-management-plugin.version>1.0.10.RELEASE</dependency-management-plugin.version> <derby.version>10.14.2.0</derby.version> <dropwizard-metrics.version>4.1.12.1</dropwizard-metrics.version> <ehcache.version>2.10.6</ehcache.version> <ehcache3.version>3.8.1</ehcache3.version> <elasticsearch.version>7.6.2</elasticsearch.version> <embedded-mongo.version>2.2.0</embedded-mongo.version> <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> <flatten-maven-plugin.version>1.2.5</flatten-maven-plugin.version> <flyway.version>6.4.4</flyway.version> <freemarker.version>2.3.30</freemarker.version> <git-commit-id-plugin.version>3.0.1</git-commit-id-plugin.version> <glassfish-el.version>3.0.3</glassfish-el.version> <glassfish-jaxb.version>2.3.3</glassfish-jaxb.version> <groovy.version>2.5.13</groovy.version> <gson.version>2.8.6</gson.version> <h2.version>1.4.200</h2.version> <hamcrest.version>2.2</hamcrest.version> <hazelcast.version>3.12.9</hazelcast.version> <hazelcast-hibernate5.version>1.3.2</hazelcast-hibernate5.version> <hibernate.version>5.4.21.Final</hibernate.version> <hibernate-validator.version>6.1.5.Final</hibernate-validator.version> <hikaricp.version>3.4.5</hikaricp.version> <hsqldb.version>2.5.1</hsqldb.version> <htmlunit.version>2.40.0</htmlunit.version> <httpasyncclient.version>4.1.4</httpasyncclient.version> <httpclient.version>4.5.12</httpclient.version> <httpcore.version>4.4.13</httpcore.version> <infinispan.version>10.1.8.Final</infinispan.version> <influxdb-java.version>2.18</influxdb-java.version> <jackson-bom.version>2.11.2</jackson-bom.version> <jakarta-activation.version>1.2.2</jakarta-activation.version> <jakarta-annotation.version>1.3.5</jakarta-annotation.version> <jakarta-jms.version>2.0.3</jakarta-jms.version> <jakarta-json.version>1.1.6</jakarta-json.version> <jakarta-json-bind.version>1.0.2</jakarta-json-bind.version> <jakarta-mail.version>1.6.5</jakarta-mail.version> <jakarta-persistence.version>2.2.3</jakarta-persistence.version> <jakarta-servlet.version>4.0.4</jakarta-servlet.version> <jakarta-servlet-jsp-jstl.version>1.2.7</jakarta-servlet-jsp-jstl.version> <jakarta-transaction.version>1.3.3</jakarta-transaction.version> <jakarta-validation.version>2.0.2</jakarta-validation.version> <jakarta-websocket.version>1.1.2</jakarta-websocket.version> <jakarta-ws-rs.version>2.1.6</jakarta-ws-rs.version> <jakarta-xml-bind.version>2.3.3</jakarta-xml-bind.version> <jakarta-xml-soap.version>1.4.2</jakarta-xml-soap.version> <jakarta-xml-ws.version>2.3.3</jakarta-xml-ws.version> <janino.version>3.1.2</janino.version> <javax-activation.version>1.2.0</javax-activation.version> <javax-annotation.version>1.3.2</javax-annotation.version> <javax-cache.version>1.1.1</javax-cache.version> <javax-jaxb.version>2.3.1</javax-jaxb.version> <javax-jaxws.version>2.3.1</javax-jaxws.version> <javax-jms.version>2.0.1</javax-jms.version> <javax-json.version>1.1.4</javax-json.version> <javax-jsonb.version>1.0</javax-jsonb.version> <javax-mail.version>1.6.2</javax-mail.version> <javax-money.version>1.0.3</javax-money.version> <javax-persistence.version>2.2</javax-persistence.version> <javax-transaction.version>1.3</javax-transaction.version> <javax-validation.version>2.0.1.Final</javax-validation.version> <javax-websocket.version>1.1</javax-websocket.version> <jaxen.version>1.2.0</jaxen.version> <jaybird.version>3.0.9</jaybird.version> <jboss-logging.version>3.4.1.Final</jboss-logging.version> <jboss-transaction-spi.version>7.6.0.Final</jboss-transaction-spi.version> <jdom2.version>2.0.6</jdom2.version> <jedis.version>3.3.0</jedis.version> <jersey.version>2.30.1</jersey.version> <jetty-el.version>8.5.54</jetty-el.version> <jetty-jsp.version>2.2.0.v201112011158</jetty-jsp.version> <jetty-reactive-httpclient.version>1.1.4</jetty-reactive-httpclient.version> <jetty.version>9.4.31.v20200723</jetty.version> <jmustache.version>1.15</jmustache.version> <johnzon.version>1.2.8</johnzon.version> <jolokia.version>1.6.2</jolokia.version> <jooq.version>3.13.4</jooq.version> <json-path.version>2.4.0</json-path.version> <json-smart.version>2.3</json-smart.version> <jsonassert.version>1.5.0</jsonassert.version> <jstl.version>1.2</jstl.version> <jtds.version>1.3.1</jtds.version> <junit.version>4.13</junit.version> <junit-jupiter.version>5.6.2</junit-jupiter.version> <kafka.version>2.5.1</kafka.version> <kotlin.version>1.3.72</kotlin.version> <kotlin-coroutines.version>1.3.8</kotlin-coroutines.version> <lettuce.version>5.3.4.RELEASE</lettuce.version> <liquibase.version>3.8.9</liquibase.version> <log4j2.version>2.13.3</log4j2.version> <logback.version>1.2.3</logback.version> <lombok.version>1.18.12</lombok.version> <mariadb.version>2.6.2</mariadb.version> <maven-antrun-plugin.version>1.8</maven-antrun-plugin.version> <maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version> <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version> <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> <maven-dependency-plugin.version>3.1.2</maven-dependency-plugin.version> <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version> <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version> <maven-failsafe-plugin.version>2.22.2</maven-failsafe-plugin.version> <maven-help-plugin.version>3.2.0</maven-help-plugin.version> <maven-install-plugin.version>2.5.2</maven-install-plugin.version> <maven-invoker-plugin.version>3.2.1</maven-invoker-plugin.version> <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version> <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version> <maven-resources-plugin.version>3.1.0</maven-resources-plugin.version> <maven-shade-plugin.version>3.2.4</maven-shade-plugin.version> <maven-source-plugin.version>3.2.1</maven-source-plugin.version> <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version> <maven-war-plugin.version>3.2.3</maven-war-plugin.version> <micrometer.version>1.5.5</micrometer.version> <mimepull.version>1.9.13</mimepull.version> <mockito.version>3.3.3</mockito.version> <mongodb.version>4.0.5</mongodb.version> <mssql-jdbc.version>7.4.1.jre8</mssql-jdbc.version> <mysql.version>8.0.21</mysql.version> <nekohtml.version>1.9.22</nekohtml.version> <neo4j-ogm.version>3.2.16</neo4j-ogm.version> <netty.version>4.1.52.Final</netty.version> <netty-tcnative.version>2.0.34.Final</netty-tcnative.version> <nio-multipart-parser.version>1.1.0</nio-multipart-parser.version> <oauth2-oidc-sdk.version>7.1.1</oauth2-oidc-sdk.version> <nimbus-jose-jwt.version>8.19</nimbus-jose-jwt.version> <ojdbc.version>19.3.0.0</ojdbc.version> <okhttp3.version>3.14.9</okhttp3.version> <oracle-database.version>19.3.0.0</oracle-database.version> <pooled-jms.version>1.1.2</pooled-jms.version> <postgresql.version>42.2.16</postgresql.version> <prometheus-pushgateway.version>0.9.0</prometheus-pushgateway.version> <quartz.version>2.3.2</quartz.version> <querydsl.version>4.3.1</querydsl.version> <r2dbc-bom.version>Arabba-SR7</r2dbc-bom.version> <rabbit-amqp-client.version>5.9.0</rabbit-amqp-client.version> <reactive-streams.version>1.0.3</reactive-streams.version> <reactor-bom.version>Dysprosium-SR12</reactor-bom.version> <rest-assured.version>3.3.0</rest-assured.version> <rsocket.version>1.0.2</rsocket.version> <rxjava.version>1.3.8</rxjava.version> <rxjava-adapter.version>1.2.1</rxjava-adapter.version> <rxjava2.version>2.2.19</rxjava2.version> <saaj-impl.version>1.5.2</saaj-impl.version> <selenium.version>3.141.59</selenium.version> <selenium-htmlunit.version>2.40.0</selenium-htmlunit.version> <sendgrid.version>4.4.8</sendgrid.version> <servlet-api.version>4.0.1</servlet-api.version> <slf4j.version>1.7.30</slf4j.version> <snakeyaml.version>1.26</snakeyaml.version> <solr.version>8.5.2</solr.version> <spring-amqp.version>2.2.11.RELEASE</spring-amqp.version> <spring-batch.version>4.2.4.RELEASE</spring-batch.version> <spring-data-releasetrain.version>Neumann-SR4</spring-data-releasetrain.version> <spring-framework.version>5.2.9.RELEASE</spring-framework.version> <spring-hateoas.version>1.1.2.RELEASE</spring-hateoas.version> <spring-integration.version>5.3.2.RELEASE</spring-integration.version> <spring-kafka.version>2.5.6.RELEASE</spring-kafka.version> <spring-ldap.version>2.3.3.RELEASE</spring-ldap.version> <spring-restdocs.version>2.0.5.RELEASE</spring-restdocs.version> <spring-retry.version>1.2.5.RELEASE</spring-retry.version> <spring-security.version>5.3.4.RELEASE</spring-security.version> <spring-session-bom.version>Dragonfruit-SR1</spring-session-bom.version> <spring-ws.version>3.0.10.RELEASE</spring-ws.version> <sqlite-jdbc.version>3.31.1</sqlite-jdbc.version> <sun-mail.version>1.6.5</sun-mail.version> <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version> <thymeleaf-extras-data-attribute.version>2.0.1</thymeleaf-extras-data-attribute.version> <thymeleaf-extras-java8time.version>3.0.4.RELEASE</thymeleaf-extras-java8time.version> <thymeleaf-extras-springsecurity.version>3.0.4.RELEASE</thymeleaf-extras-springsecurity.version> <thymeleaf-layout-dialect.version>2.4.1</thymeleaf-layout-dialect.version> <tomcat.version>9.0.38</tomcat.version> <unboundid-ldapsdk.version>4.0.14</unboundid-ldapsdk.version> <undertow.version>2.1.4.Final</undertow.version> <versions-maven-plugin.version>2.7</versions-maven-plugin.version> <webjars-hal-browser.version>3325375</webjars-hal-browser.version> <webjars-locator-core.version>0.45</webjars-locator-core.version> <wsdl4j.version>1.6.3</wsdl4j.version> <xml-maven-plugin.version>1.0.2</xml-maven-plugin.version> <xmlunit2.version>2.7.0</xmlunit2.version> </properties> <dependencyManagement> <dependencies> <!--一些依赖--> </dependencies> </dependencyManagement> <build> <pluginManagement> <!-- 一些插件--> </pluginManagement> </build> </project>

