在log4j1.2的版本里,发现有两把性能低下的锁,一把就是在Category的callAppender方法里,代码如下
public
void callAppenders(LoggingEvent event) {
int writes = 0;
for(Category c = this; c != null; c=c.parent) {
// Protected against simultaneous call to addAppender, removeAppender,...
synchronized(c) {
if(c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
if(!c.additive) {
break;
}
}
}
if(writes == 0) {
repository.emitNoAppenderWarning(this);
}
}
为了防止在记录日志的时候appender被更新,所以加了一把独占锁,如果一个线程正在记录日志,那么其他线程用到了这个logger的都会在这里等待,从实际运行情况来看,很少有经常变动的appender,所以这种情况依然是读多写少,个人觉得极其适合用ReentrantReadWriteLock来处理,把synchronized换成读锁,在addAppender或者removeAppender上增加写锁,这样就很大程度上避免了锁竞争,事实上最新版的log4j就替换为了读写锁,只不过是用来非重入的读写锁。改完之后性能大幅度提高了。修改后的代码如下
public void callAppenders(LoggingEvent event) {
int writes = 0;
for (Category c = this; c != null; c = c.parent) {
// Protected against simultaneous call to addAppender,
// removeAppender,...
try {
c.readLock.lock();
if (c.aai != null) {
writes += c.aai.appendLoopOnAppenders(event);
}
} finally {
c.readLock.unlock();
}
// synchronized (c) {
// if (c.aai != null) {
// writes += c.aai.appendLoopOnAppenders(event);
// }
// }
if (!c.additive) {
break;
}
}
if (writes == 0) {
repository.emitNoAppenderWarning(this);
}
}
另一个锁在AppenderSkeleton的doAppend方法上,因为大部分appender都从这里派生,真正执行写任务的都在子类,但是框架义无反顾地走doAppend上加了一把锁,无论子类用不用锁,都已经锁上了。所以如果子类无需并发处理的时候,可以重写了doAppend方法,去掉这把锁,这样性能又会大幅度提高。
public synchronized void doAppend(LoggingEvent event) {
if (closed) {
LogLog.error("Attempted to append to closed appender named ["
+ name + "].");
return;
}
if (!isAsSevereAsThreshold(event.getLevel())) {
return;
}
Filter f = this.headFilter;
FILTER_LOOP: while (f != null) {
switch (f.decide(event)) {
case Filter.DENY:
return;
case Filter.ACCEPT:
break FILTER_LOOP;
case Filter.NEUTRAL:
f = f.next;
}
}
this.append(event);
}
修改了这2把锁后,性能就很高了,其实没必要对日志做异步处理,异步处理的伸缩性做的好不好,以及他的饥饿策略等等,都有可能带来不理想的结果。
分享到:
相关推荐
10. **优化的并发支持**:Log4j2利用Java 5提供的并发特性,能够在较低级别上执行锁定操作,有效避免了Log4j 1.x中出现的死锁问题。 ### Log4j2与Log4j效率对比 #### 测试环境与方法 为了准确评估Log4j2与Log4j...
**log4j-core-2.12.4.jar** 则是Log4j 2的核心实现模块,它实现了API模块中定义的接口,并负责实际的日志记录工作,包括日志事件的处理、输出格式化、日志存储以及性能优化等功能。此外,核心模块还包含了一些附加...
- **性能优化**:持续的性能优化是Log4j 2的核心之一,新版本可能包含了对日志处理速度的提升,使得在高并发场景下,日志记录依然能保持流畅。 3. **核心组件**: - **Layouts**:定义了日志事件的输出格式,如...
5. **性能优化**:Log4j 1.2.15针对性能进行了优化,尤其是在高并发环境下的表现,降低了日志处理的开销。 三、使用Log4j 1.2.15.jar 1. **引入依赖**:在项目中添加Log4j 1.2.15.jar依赖,可以手动下载放入类路径...
**标题与描述解析** 标题提及的是"log4j-API-最新稳定版本log4j-1.2.17",这表明我们关注的是日志框架...对于使用Log4j的开发者来说,理解和掌握API的各个方面至关重要,以实现有效的日志管理并优化应用程序的监控。
**日志框架Log4j详解** 在Java开发中,日志记录是一项不可或缺的功能,它能够帮助开发者追踪程序运行状态,定位错误,优化性能,并为后期维护提供重要信息。Log4j是Apache组织开发的一个强大的、灵活的日志记录框架...
性能优化** 在大型系统中,日志记录可能对性能有影响。Log4j允许我们在运行时动态调整日志级别,避免不必要的日志输出,提高系统性能。 **6. 扩展与集成** 除了基本的日志功能,Log4j还支持与其他日志框架(如...
这不仅有助于问题排查,也有利于系统维护和性能优化,因为过多的日志可能会占用大量磁盘空间,影响系统性能。 总的来说,Log4j是一个强大且灵活的日志工具,对于任何Java开发项目来说都是必不可少的组件。它通过`...
《深入理解Log4j:Apache日志框架的基石》 ...了解并熟练掌握Log4j的使用,有助于提升开发效率,优化系统的可维护性。然而,随着技术的发展,建议关注更新的Log4j 2.x版本,以利用其更先进的特性和更好的性能。
这些版本之间的差异主要体现在功能增强、性能优化和安全修复上。例如,从1.2.12到1.2.13的升级,可能修复了一些已知的bug,增强了稳定性;而从1.2.16到1.2.17的更新,可能会对某些关键功能进行了改进或增加了新的...
4. **性能优化**:虽然安全是此次更新的首要目标,但开发团队也对性能进行了优化,确保在增强安全的同时不影响系统的正常运行。 5. **兼容性检查**:2.16.0-rc1版本考虑到与先前版本的兼容性,以确保升级过程尽可能...
总之,log4j作为一种强大的日志管理工具,不仅能够提高应用程序的可维护性和可扩展性,还能够帮助开发者更高效地进行故障排查和性能优化。对于任何涉及大量数据处理或复杂逻辑的应用程序而言,正确配置并使用log4j都...
四、Log4j-1.2.16的优化与维护 1. **日志级别管理**:在生产环境中,通常会将日志级别设置为WARN或ERROR,以减少不必要的日志输出,提高性能。 2. **日志分割**:为了便于管理和分析,可以配置Log4j按日期分割日志...
Log4j是Apache的一个开源项目,提供了一套强大的日志API,而Log4j2是其升级版,旨在解决Log4j1.x存在的性能问题和设计缺陷。 Log4j2的核心改进在于其引入了全新的API——Log4j 1.2 API,文件`log4j-1.2-api-2.8.2....
在软件开发过程中,日志记录是一项至关重要的任务,它可以帮助开发者追踪程序运行状态、定位问题以及进行性能优化。Log4j2作为Java领域广泛使用的日志框架,以其高效、灵活的特点深受青睐。本文将基于"Log4j2 Demo...
在实际应用中,我们还可以调整Log4j2的异步配置,例如设置队列大小、选择不同的Appender实现(如FileAppender、ConsoleAppender等)以及日志级别,以优化日志性能和存储需求。此外,Log4j2的AsyncAppender利用了LMAX...
四、使用Log4j进行日志记录 在Java代码中,我们通过创建Logger实例来记录日志。例如: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger....
这个"**log4j-2.17.1**"的版本是该框架的一个更新,提供了修复的安全漏洞和性能优化。以下是关于Log4j 2.17.1的一些关键知识点: 1. **日志框架**:Log4j 是Apache软件基金会的一个项目,它为Java应用程序提供了一...
5. **性能优化** - 为了提高性能,避免不必要的日志输出,应合理设置日志级别。DEBUG级别信息只在调试时开启,生产环境中通常使用INFO或更高的级别。 - 使用异步Appender可以提高日志记录效率,防止日志输出对应用...
新版本和旧版本的log4j.jar可能存在功能更新、性能优化、安全修复等差异,因此根据项目需求选择合适的版本至关重要。 3. **IDEA与log4j**: IntelliJ IDEA(简称IDEA)是一款流行的Java集成开发环境,它支持将log4j...