MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题。
区别于BeanUtils这种通过反射,它通过编译器编译生成常规方法,将可以很大程度上提升效率。
MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题。
区别于BeanUtils这种通过反射,它通过编译器编译生成常规方法,将可以很大程度上提升效率。
在 Log4j2 中,要识别和使用自定义的日志组件,需要进行以下步骤:
org.apache.logging.log4j.core.Appender
接口的类来定义自定义的日志组件。该接口定义了日志记录事件的处理方法。你可以根据自己的需求自定义日志组件的行为和功能。
配置 Log4j2:接下来,你需要在 Log4j2 的配置文件中添加对自定义日志组件的配置。配置文件通常是一个 XML 文件,其中定义了日志记录器(Logger)、日志级别(Level)、Appender(日志组件)等元素。在配置文件中,你需要添加一个对自定义日志组件的配置。
在上面的示例中,CustomAppender
是自定义日志组件的类名,custom
是自定义日志组件的名称(用于引用),你需要将这些值替换为你自己的类名和名称。
使用自定义日志组件:完成上述配置后,你就可以在代码中使用 Log4j2 记录日志了。通过获取 Logger 对象并使用相应的日志级别调用适当的方法,你可以记录日志,并且该日志将由自定义的日志组件处理。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyClass {
private static final Logger logger = LogManager.getLogger(MyClass.class);
public void doSomething() {
logger.info("This is a log message.");
}
}
相同的日志打印了两次,且因为日志的配置不同,导致脱敏的情况不一致。
package com.ryo.log4j2.cfg.additivity;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SimpleDemo {
private static final Logger logger = LogManager.getLogger(SimpleDemo.class.getName());
public static void main(String[] args) {
logger.info("do it");
}
}
对于log4j2的同步和异步的讲解,本人也是找了很多的资料,也阅读了官方的文档和源码。
对于两者的区别已经发送log执行流程可参考下面的文章,讲的挺全面的:
https://www.cnblogs.com/yeyang/p/7944906.html
其中对于AsyncAppender和AsyncLogger源码的解读可参考:
https://www.cnblogs.com/lewis09/p/10003462.html
https://www.cnblogs.com/lewis09/p/10004117.html
异步日志记录可以通过在单独的线程中执行 I/O 操作来提高应用程序的性能。
Log4j 2 在这方面做出了许多改进。
异步 Logger 是 Log4j 2 中的新增功能。它们的目标是尽快从对 Logger.log 的调用返回到应用程序。
您可以选择使所有记录器异步或混合使用同步和异步记录器。
使所有记录器异步将提供最佳性能,而混合则为您提供更大的灵活性。
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-logging
org.springframework.boot
spring-boot-starter-log4j2
2.1.0.RELEASE
org.projectlombok
lombok
true
接入 log4j2 的时候,为了提升性能。使用了异步的 logger,但是遇到了报错:
log4j2 null object returned for AsyncLogger in Loggers
Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。
异步日志情况下,增加 Disruptor 队列长度并配置队列堵塞丢弃策略从可以增加高并发下的性能,实现如下:
(1) jvm 参数:-DLog4jAsyncQueueFullPolicy=Discard -DLog4j2.asyncLoggerRingBufferSize:指定队列的长度(根据实际压测情况调试,一般不会指定长度)
(2) 或者在log4j2.component.properties中配置丢弃策略:
日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦。
sensitive 项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发。
支持 logback 和 log4j2 等常见的日志脱敏插件。
日志插件解决正则匹配长文本可能出现的回溯问题,性能远超正则。