maven 项目中 Springboot 整合Log4j2 详解
一、Apache Log4j 2.
- 了解:Apache Log4j 2是Log4j的升级版,对Log4j的前身Log4j 1.x进行了重大改进,并提供了Logback中可用的许多改进,同时解决了Logback体系结构中的一些固有问题。
- 特征:
API分离:
Log4j的API与实现是分开的,从而使应用程序开发人员可以清楚地了解他们可以使用哪些类和方法,同时确保向前的兼容性。这允许Log4j团队以兼容的方式安全地改进实施。
性能提升:
Log4j 2包含基于LMAX Disruptor库的下一代异步记录器。在多线程方案中,与Log4j 1.x和Logback相比,异步Logger的吞吐量高18倍,延迟降低了几个数量级。
支持多种API:
Log4j 2 API将提供最佳性能,而Log4j 2提供对Log4j 1.2,SLF4J,Commons Logging和java.util.logging(JUL)API的支持。
避免锁定:
编码为Log4j 2 API的应用程序始终可以选择使用任何SLF4J兼容库作为其Log4j-to-slf4j适配器的记录器实现。
自动重载配置:
与Logback一样的是,Log4j 2可以在修改后自动重新加载其配置。与Logback不同的是,它在进行重新配置时不会丢失日志事件。
进阶筛选:
与Logback一样,Log4j 2支持基于上下文数据,标记,正则表达式和Log事件中的其他组件进行过滤。可以指定过滤以将所有事件应用到所有事件,然后再传递给Logger或事件通过Appender。此外,过滤器还可以与Loggers关联。与Logback不同,您可以在任何这些情况下使用通用的Filter类。
插件架构:
Log4j使用插件模式来配置组件。这样,您无需编写代码即可创建和配置Appender,Layout,Pattern Converter等。Log4j自动识别插件,并在配置引用它们时使用它们。
物业支持:
您可以在配置中引用属性,Log4j将直接替换它们,或者Log4j将它们传递给将动态解析它们的基础组件。属性来自配置文件中定义的值,系统属性,环境变量,ThreadContext映射以及事件中存在的数据。用户可以通过添加自己的查找插件来进一步自定义属性提供程序。
Java 8 Lambda支持:
以前,如果构建日志消息的成本很高,则通常会在构建消息之前显式检查是否启用了请求的日志级别。在Java 8上运行的客户端代码可以受益于Log4j的lambda支持。如果未启用请求的日志级别,由于Log4j不会评估lambda表达式,因此可以用更少的代码获得相同的效果。
自定义日志级别
在Log4j 2中,可以通过代码或配置轻松定义自定义日志级别。不需要子类。
无垃圾
在稳态日志记录期间,Log4j 2 在独立应用程序中是无垃圾的,而在Web应用程序中是低垃圾的。这样可以减少垃圾收集器上的压力,并可以提供更好的响应时间性能。
与应用服务器集成
版本2.10.0引入了模块log4j-appserver,以改善与Apache Tomcat和Eclipse Jetty的集成。
启用云
2.12.0版引入了对通过Lookup访问Docker容器信息以及通过Spring Cloud Configuration访问和更新Log4j配置的支持。
二、pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
三、配置文件
注意!配置文件名称是规定好的,其配置文件只能采用.xml, .json或者 .jsn。在默认情况下,系统选择configuration文件。我这里使用的是log4j2.xml。
一个Logger上可以装配多个Appender。用Log4j的说法,一个输出的目标位置被称为Appender。目前,Appender存在几种:控制台、文件、远程Socket服务器、Apache Flume、JMS、远程UNIX系统日志后台以及好几种数据库API。
<?xml version="1.0" encoding="utf-8"?>
<configuration status="off">
<appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %m%n"/>
</Console>
<RollingFile name="info_appender" fileName="logs/log.log" filePattern="logs/%d{yyyy-MM-dd}/log_%i.log.gz">
<Filters>
<ThresholdFilter level="info"/>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="200 MB"/>
</Policies>
</RollingFile>
<RollingFile name="error_appender" fileName="logs/log-error.log" filePattern="logs/%d{yyyy-MM-dd}/log_error_%i.log.gz">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="200 MB"/>
</Policies>
<DefaultRolloverStrategy max="3"/>
</RollingFile>
<RollingFile name="sql_appender" fileName="logs/log-sql.log" filePattern="logs/%d{yyyy-MM-dd}/log_sql_%i.log.gz">
<Filters>
<ThresholdFilter level="debug"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="200 MB"/>
</Policies>
<DefaultRolloverStrategy max="3"/>
</RollingFile>
</appenders>
<loggers>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="info_appender"/>
<AppenderRef ref="error_appender"/>
</Root>
<Logger name="errorLog" level="info" additivity="false">
<appender-ref ref="error_appender" level="info"/>
</Logger>
<Logger name="com.ithhk.log_test.mapper" level="DEBUG" additivity="false">
<appender-ref ref="sql_appender" level="DEBUG"/>
</Logger>
</loggers>
</configuration>