LoggerEvent
当threshold和logger-level都通过后,会创建LoggingEvent对象。里面可以得到当前时间,线程信息。NDC, MDC and 本地信息。LocationInformation是log4j的内部信息,包括了文件名,代码行数,类的名字等信息。它是从执行堆栈信息取到的。LoggingEvent是可以序列化的对象。
性能
性能中的一个是在于计算成本。而对于日志的调用可能存在上千上万次得调用。
第一个如是在代码本身的可能造成的性能问题,如
x.debug("Entry number: " +i+" is "+entry[i]);
像这样的日志代码我们很常见吧。这里我们会把message拼装好,然后由log4j决定是否需要调用这个方法。那么如果debug级别是无效的话,这里的"Entry number: " +i+" is "+entry[i]字符串拼接代码将会成为无效的代码。因此更好的写法应该是:
if(x.isDebugEnabled() {
x.debug("Entry number: "+i+" is "+String.valueOf(entry[i]));
}
这里首先是判断是否开启了debug级别。如果没有开启,那么就不会执行if里面的代码,因此性能会更好。
测试
package com.cgodo.log4j.test;
import java.io.IOException;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerRepository;
/**
* log4j测试
*
* @author liyixing liyixing1@yahoo.com.cn
* @version 1.0
* @since 2011-7-3 上午01:37:42
*/
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BasicConfigurator.configure();
Logger log = Logger.getLogger("a");
log.setLevel(Level.INFO);
long t1 = System.currentTimeMillis();
/*
注意,这里我只是为了方便测试,这更好的写法应该是在for之前写if (log.isDebugEnabled())
*/
for (int i = 0; i < 500; i++) {
if (log.isDebugEnabled()) {
log.info("调用中" + "i是" + i);
}
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
t1 = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
log.info("调用中" + "i是" + i);
}
t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
}
第一种写法只需要0毫秒
而第二种写法则耗费了15毫秒(注,if语句对于一般的pc机器来说是纳秒级别的)
Logger还有isInfoEnabled方法,isEnabledFor方法(用于查询指定级别是否开启)。对于error,fatal,WARN等级别,由于很少使用,所以不存在对应的isXXXEnabled方法,因为这些级别的记录很少存在,因此在性能上的提升很少。
在有些版本的java中,对于if(final常量或者直接常量的值为false)之类的语句,会把这样的if语句和if的体代码删除掉,来优化java的执行。
因此我们可以把debug级别是否开启,使用一个静态变量保存。然后当需要关闭的时候,只需要把这个变量设置为false,那么编译后,if语句和if的体内容会被删除掉,那么性能会更好。但是这样就无法做到可配置性。因此在实际项目中很少这么做。
另一个性能问题是在于祖先的问题。在创建logger对象的时候,正常情况下需要将其的祖先创建出来。但是这样的话,logger对象就可能存在很多个。那么,而log4j的处理是直接连到到最近的一个需要被创建的祖先,而不会把每一级别的祖先都创建出来。
实际记录(格式化和输出到设备上)的性能
log4j本身提供的几个设备appender和布局实现,一般时间是在100-300微秒(可能更长)
分享到:
相关推荐
Log4j 2.11.0采用模块化设计,主要包括配置器(Configurator)、日志事件(LoggingEvent)、日志器(Logger)、布局(Layout)、Appender和过滤器(Filter)等核心组件。它们协同工作,实现日志的生成、格式化、...
5. `org.apache.log4j.spi.LoggingEvent`: 用于封装日志事件的数据结构,包含了日志级别、时间戳、信息等内容。 通过对这些核心类的阅读和理解,我们可以更好地掌握Log4j的工作流程,从而在实际项目中更有效地使用...
Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...
标题中的“commons-logging”和“Log4j”是两个在Java编程中广泛使用的日志处理框架。它们在日志管理领域中各自扮演着不同的角色,而它们之间的关系则涉及到日志实现的抽象与具体实现的层次问题。 首先,让我们了解...
在这个场景中,我们使用了SLF4J(Simple Logging Facade for Java)作为日志抽象层,它为各种日志框架提供了统一的API,而SLF4J-log4j12-1.5.0.jar和slf4j-api-1.5.0.jar正是SLF4J与Log4j之间的桥梁,使得我们可以...
Log4j 2.x系列曾出现过著名的远程代码执行漏洞(CVE-2021-44228)。虽然2.5版本不包含此漏洞,但了解源码有助于我们理解漏洞成因,预防类似问题发生。 总结,Apache Log4j 2.5源码不仅揭示了日志框架的设计思想,也...
《log4j使用手册》是Java开发者必备的参考资料,它主要涵盖了如何在Java应用程序中使用log4j进行日志管理的全面知识。log4j是一款强大的日志框架,由Apache软件基金会开发,广泛应用于各种Java项目中,为开发人员...
1. **创建自定义Appender**:你需要继承Log4j的AppenderSkeleton类,并实现其必要的方法,如`append()`。在这个方法中,你可以获取到日志事件(LoggingEvent),并从中提取出日志信息。 2. **设置Layout**:根据...
【log4j小测试】项目主要探讨了如何在log4j框架中实现同级别日志分文件存储的功能。Log4j作为一款广泛使用的Java日志处理工具,它提供了丰富的配置选项,使得开发者能够灵活地控制日志输出的方式、格式以及存储位置...
在众多日志框架中,Apache Log4j因其灵活性和强大的功能备受青睐。本文将深入探讨如何通过Log4j的配置实现按级别单独打印日志至不同的文件,以及两种实现这一目标的方法。 ### 关键配置项解析 首先,我们来看一段...
`log4net`是一款广泛使用的日志记录框架,它源自Java平台上的log4j,并被移植到了.NET环境中。这款开源库提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,且具有可配置性和可扩展性。在深入...
log4qt是Qt平台上的一款日志记录框架,它是Apache log4j的Qt版本,适用于C++开发者。在Visual Studio(VS)环境中,log4qt提供了方便的日志管理和记录功能,为开发人员提供了强大的调试和信息追踪工具。本篇文章将...
接下来,我们需要在代码中初始化log4net,并设置一个全局的日志助手类,用于调用log4net的方法。例如: ```csharp using log4net; using log4net.Config; public class LogManager { private static readonly ...
6. **日志事件**:在`slf4j-api`模块中,SLF4J定义了`org.slf4j.event.LoggingEvent`类,这是一个抽象类,用于表示一个日志事件。尽管通常由日志实现处理,但了解其结构对理解日志工作原理是有帮助的。 7. **桥接与...
这个框架深受Apache的Log4j启发,旨在帮助开发者方便地进行日志输出,便于调试、监控和问题排查。在Log4QT中,我们可以找到一系列的类和接口,用于配置、管理和记录日志信息。下面,我们将深入探讨这些文件的功能和...
- LoggingEvent是log4net中的核心类,包含了日志事件的所有信息。 6. **使用log4net** - 在代码中,我们通过`ILog`接口获取日志器实例,然后调用`Debug`、`Info`、`Warn`、`Error`、`Fatal`等方法记录日志。 - ...
<layout type="log4net.Layout.XmlLayoutSchemaLog4j" /> ``` 这段配置会将日志信息插入到名为“LogTable”的表中,表需要包含“LogDate”和“LoggingEvent”字段。 在实际应用中,还需要在程序启动时初始化log...
这是Perf4j用于存储性能统计数据的自定义LoggingEvent。它扩展了Logback的LoggingEvent,包含了额外的计时信息,如方法执行时间、调用次数等。这些信息对于分析性能至关重要。 3. **UserService.java**: 这可能...
log4cplus是C++的一个轻量级日志记录库,它借鉴了Java中的log4j理念,为开发者提供了灵活且高效的日志管理功能。本文将详细讲解如何对log4cplus进行小幅度的修改,以实现自定义日志保存路径的功能。 首先,了解log4...
Chainsaw是一个Log4J软件包的GUI日志查看器和过滤器。 它侦听使用SocketAppender发送的LoggingEvent对象,并将它们显示在表中。 可以根据优先级,线程名称,类别名称和消息来过滤事件。 它可以