当前位置:网站首页>Log4j2
Log4j2
2022-07-02 09:41:00 【xx985】
Log4j2简介
Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。被誉为是目前最优秀的Java日志框架。
Log4j2特征
性能提升
Log4j2包含基于LMAX Disruptor库的下一代异步记录器。在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低。自动重新加载配置
与Logback一样,Log4j2可以在修改时自动重新加载其配置。与Logback不同,它会在重新配置发生时不会丢失日志事件。高级过滤
与Logback一样,Log4j2支持基于Log事件中的上下文数据,标记,正则表达式和其他组件进行过滤,此外,过滤器还可以与记录器关联。与Logback不同,Log4j2可以在任何这些情况下使用通用的Filter类。插件架构
Log4j使用插件模式配置组件。因此,您无需编写代码来创建和配置Appender,Layout,Pattern Converter等。在配置了的情况下,Log4j自动识别插件并使用它们。无垃圾机制
在稳态日志记录期间,Log4j2 在独立应用程序中是无垃圾的,在Web应用程序中是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应性能。目前市面上最主流的日志门面就是SLF4J,虽然Log4j2 也是日志门面,因为它的日志实现功能非常强大,性能优越。所以我们一般情况下还是将 Log4j2 看作是日志的实现
SLF4j + Log4j2 的组合,是市场上最强大的日志功能实现方式,绝对是未来的主流趋势。
异步日志
异步日志是log4j2最大的特色,其性能的提升主要也是从异步日志中受益。
Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger
注意这是两种不同的实现方式,在设计和源码上都是不同的体现。AsyncAppender方式
是通过引用别的Appender来实现的,当有日志事件到达时,会开启另外一个线程来处理它们。需要注意的是,如果在Appender的时候出现异常,对应用来说是无法感知的。 AsyncAppender应该在它引用的Appender之后配置,默认使用 java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库。 当使用此Appender的时候,在多线程的环境下需要注意,阻塞队列容易受到锁争用的影响,这可能会对性能产生影响。这时候,我们应该考虑使用无锁的异步记录器(AsyncLogger)。AsyncLogger方式
AsyncLogger才是log4j2实现异步最重要的功能体现,也是官方推荐的异步方式。
它可以使得调用Logger.log返回的更快。你可以有两种选择:全局异步和混合异步。
全局异步:所有的日志都异步的记录,在配置文件上不用做任何改动,只需要在jvm启动的时候增加一个参数即可实现。
混合异步:你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活。虽然Log4j2提供以一套异常处理机制,可以覆盖大部分的状态,但是还是会有一小部分的特殊情况是无法完全处理的,比如我们如果是记录审计日志(特殊情况之一),那么官方就推荐使用同步日志的方式,而对于其他的一些仅仅是记录一个程序日志的地方,使用异步日志将大幅提升性能,减少对应用本身的影响。混合异步的方式需要通过修改配置文件来实现,使用AsyncLogger标记配置。
<!-- log4j2 依赖 **********************************************-->
<!-- slf4j日志门面 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- log4j适配器 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2日志门面 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- 异步日志依赖 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency><?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--
src/main/java/com/log4j2
配置全局通用属性
-->
<properties>
<property name="logDir">D:</property>
</properties>
<!-- 配置appender -->
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</Console>
<!-- 配置文件输出-->
<File name="fileAppender" fileName="${logDir}//log4j2.log">
<!-- 配置文件输出格式 -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</File>
<!--
按照指定规则来拆分日志文件
fileName:日志文件的名字
filePattern:日志文件拆分后文件的命名规则
$${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
例如:2021-01-01这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
2021-01-02这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
-->
<!-- <RollingFile name="rollingFile" fileName="${logDir}/rollog.log"-->
<!-- filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">-->
<!-- <!– 日志消息格式 –>-->
<!-- <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>-->
<!-- <Policies>-->
<!-- <!– 在系统启动时,触发拆分规则,产生一个日志文件 –>-->
<!-- <OnStartupTriggeringPolicy/>-->
<!-- <!– 按照文件的大小进行拆分 –>-->
<!-- <SizeBasedTriggeringPolicy size="10KB"/>-->
<!-- <!– 按照时间节点进行拆分 拆分规则就是filePattern–>-->
<!-- <TimeBasedTriggeringPolicy/>-->
<!-- </Policies>-->
<!-- <!– 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则–>-->
<!-- <DefaultRolloverStrategy max="30"/>-->
<!-- </RollingFile>-->
<!-- 配置异步日志 (不能和下面的自定义配置异步同时存在)-->
<!--<Async name="myAsync">
<!– 将控制台输出做异步的操作 –>
<AppenderRef ref="consoleAppender"/>
</Async>-->
</Appenders>
<!-- 配置logger -->
<Loggers>
<!-- 自定义logger,让自定义的logger为异步logger -->
<!-- includeLocation="false"表示去除日志记录中的行号信息,这个行号信息非常的影响日志记录的效率(生产中都不加这个行号)
严重的时候可能记录的比同步的日志效率还有低
additivity="false" 表示不继承rootlogger -->
<AsyncLogger name="com.log4j2" level="trace"
includeLocation="false" additivity="false">
<!-- 将控制台输出consoleAppender,设置为异步打印 -->
<AppenderRef ref="consoleAppender"/>
<!-- 将控制台输出fileAppender,设置为异步打印 -->
<AppenderRef ref="fileAppender"/>
</AsyncLogger>
<!-- 配置rootlogger -->
<Root level="trace">
<!-- 引用Appender -->
<!--<AppenderRef ref="consoleAppender"/>-->
<AppenderRef ref="fileAppender"/>
<!--<AppenderRef ref="rollingFile"/>-->
<!--<AppenderRef ref="myAsync"/>-->
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>package com.log.log4j2;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4j2Test {
@Test
public void test01(){
/*--------------------------------------------------------
入门案例
单纯的使用Log4j2的 门面+实现
默认为error级别信息的打印
不过目前最主流的日志使用搭配方式:slf4j+log4j2
*/
/*---------------------使用配置文件-----------------------------------
使用配置文件
log4j2是参考logback创作出来的,所以配置文件也是使用xml
log4j2同样是默认加载类路径(resources)下的log4j2.xml文件中的配置
根标签,所有日志相关信息,都是在根标签中进行配置
<Configuration status="debug" monitorInterval="数值"></Configuration>
在根标签中,可以加属性
status="debug" 日志框架本身的日志输出级别
monitorInterval="5" 自动加载配置文件的间隔时间,不低于5秒
*/
/*--------------------------------------------------------
虽然log4j2也是日志门面,但是现在市场的主流趋势仍然是slf4j
所以我们仍然需要使用slf4j作为日志门面,搭配log4j2强大的日志实现功能,进行日志的相关操作
接下来我们配置的就是当今市场上的最强大,最主流的日志使用搭配方式:
slf4j+log4j2
1.导入slf4j的日志门面
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
2.导入log4j2的适配器
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
3.导入log4j2的日志门面
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
4.导入log4j2的日志实现
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
执行原理:slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现
*/
/*---------------将日志输出到文件中-----------------------------------------
<File name="fileAppender" fileName="${logDir}//log4j2.log">
<!-- 配置文件输出格式 -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</File>
*/
/*---------------日志的拆分-----------------------------------------
<RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- 日志消息格式 -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
<Policies>
<!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
<OnStartupTriggeringPolicy/>
<!-- 按照文件的大小进行拆分 -->
<SizeBasedTriggeringPolicy size="10KB"/>
<!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
*/
// 单纯的使用Log4j2的 门面+实现
// Logger logger = LogManager.getLogger(Log4j2Test.class);
// 使用lf4j+log4j2
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
@Test
public void test02(){
/*
异步日志实现(单独分配线程做日志的记录)
方式1:使用AsyncAppender的方式
1.添加异步日志依赖
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency>
2.在Appenders标签中,对于异步进行配置
使用Async标签
<!-- 配置异步日志 -->
<Async name="myAsync">
//将控制台输出做异步的操作
<AppenderRef ref="consoleAppender"/>
</Async>
3.rootlogger引用Async
<Root>
<AppenderRef ref="myAsync"/>
</Root>
*********************************************
异步日志实现(单独分配线程做日志的记录)
方式2:使用AsyncLogger的方式
1、全局异步:
所有的日志都是异步的日志记录,在配置文件上不用做任何的改动
只需要在类路径resources下添加一个properties属性文件,做一步配置即可
文件名要求是:log4j2.component.properties
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
2、混合异步:(********主要用这个*********)
可以在应用中同时使用同步日志和异步日志,这使得日志的配置及输出会更加的灵活
需求:
假设我们现在有自定义的logger -- com.log
让自定义的logger是异步的
让rootlogger是同步的
就是说文件在这个路径下(com.log)的日志是异步操作,其他路径则是同步
includeLocation="false" 表示去除日志记录中的行号信息,
additivity="false" 表示不继承rootlogger
<AsyncLogger name="com.log" level="trace"
includeLocation="false" additivity="false">
<!-- 将控制台输出consoleAppender,设置为异步打印 -->
<AppenderRef ref="consoleAppender"/>
</AsyncLogger>
注意:
在做测试前,一定要将全局的异步配置注释掉
对于当前的logger,Log4j2Test01.class
Log4j2Test01本身就是在我们自定义的logger路径下的
注意:
如果使用异步日志
AsyncAppender、AsyncLogger不要同时出现,没有这个需求,效果也不会叠加
如果同时出现,那么效率会以AsyncAppender为主
AsyncLogger的全局异步和混合异步也不要同时出现,没有这个需求,效果也不会叠加
*/
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
//日志的记录
for (int i = 0; i < 2000; i++) {
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
//系统业务逻辑
for (int i = 0; i < 1000; i++) {
System.out.println("------------------");
}
}
}
边栏推荐
- 文件操作(详解!)
- HOW TO ADD P-VALUES ONTO A GROUPED GGPLOT USING THE GGPUBR R PACKAGE
- Eight sorting summaries
- Attribute acquisition method and operation notes of C # multidimensional array
- 动态内存(进阶四)
- On April 17, 2022, the five heart matchmaker team received double good news
- Programmer growth Chapter 6: how to choose a company?
- 通讯录的实现(文件版本)
- Cmake cross compilation
- PgSQL string is converted to array and associated with other tables, which are displayed in the original order after matching and splicing
猜你喜欢

The selected cells in Excel form have the selection effect of cross shading

揭露数据不一致的利器 —— 实时核对系统

抖音海外版TikTok:正与拜登政府敲定最终数据安全协议

YYGH-9-预约下单

PgSQL string is converted to array and associated with other tables, which are displayed in the original order after matching and splicing

6方面带你认识LED软膜屏 LED软膜屏尺寸|价格|安装|应用

ESP32存储配网信息+LED显示配网状态+按键清除配网信息(附源码)

Cluster Analysis in R Simplified and Enhanced

【2022 ACTF-wp】

GGPLOT: HOW TO DISPLAY THE LAST VALUE OF EACH LINE AS LABEL
随机推荐
Mmrotate rotation target detection framework usage record
Tidb DM alarm DM_ sync_ process_ exists_ with_ Error troubleshooting
[visual studio 2019] create and import cmake project
Implementation of address book (file version)
Cluster Analysis in R Simplified and Enhanced
Esp32 stores the distribution network information +led displays the distribution network status + press the key to clear the distribution network information (source code attached)
动态内存(进阶四)
Is it safe to open a stock account through the QR code of the securities manager? Or is it safe to open an account in a securities company?
K-Means Clustering Visualization in R: Step By Step Guide
Bedtools tutorial
PX4 Position_Control RC_Remoter引入
电脑无缘无故黑屏,无法调节亮度。
HOW TO CREATE AN INTERACTIVE CORRELATION MATRIX HEATMAP IN R
What is the relationship between digital transformation of manufacturing industry and lean production
2022年4月17日五心红娘团队收获双份喜报
Power Spectral Density Estimates Using FFT---MATLAB
JS -- take a number randomly from the array every call, and it cannot be the same as the last time
Take you ten days to easily finish the finale of go micro services (distributed transactions)
ROS lacks catkin_ pkg
可昇級合約的原理-DelegateCall