Apache Log4j 架构
Apache Log4j是当前在J2EE和J2SE开发中用得最多的日志框架(几乎所有项目都用它),因为它具有出色的性能、灵活的配置以及丰富的功能,并且在业务有特殊的要求时,可以使用自定义组件来代替框架中已有的组件来满足要求。
log4j组件介绍
Log4j主要有三个组件:
•Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
•Appender:负责日志的输出,Log4j已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。
•Layout:负责日志信息的格式化。
Logger 层级介绍
Logger的层级是logger名字指定的,如x.y 表示两层,x层和y层,x是y的父层级,x.y所在层级是y层级
log4j.additivity.* = false : 表示当前logger不需要打到父层级所指定的appender,只打到当前的appender;
默认true:表示当前logger将打印日志到当前的appender及所有的父层级所指定的appender
Logger和Appender是一对多,Appender和Layout是一对一关系。
这三个组件中,主要的扩展点是Appender.
下面先介绍一个日志分级输出(即不同级别日志输出到不同地方)。
a.使用不同Logger,比如logger1专门输出Info级别日志,logger2专门输出ERROR级别日志,等等。不过一般都是用一个logger,所以这种做法不是太可取。
b.使用FILTER(如:LevelRangeFilter),但是需要注意的是要用XML配置文件的方式。使用properties方式不支持,properties方式还有一些其他高级功能也不支持。
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<!--#log4j中有5级logger ,#FATAL 0 ,#ERROR 3 ,#WARN 4 ,#INFO 6 ,#DEBUG 7 -->
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<!--输出到控制台-->
<!--
<appender name="LOG.Console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
</appender>
-->
<!--将级别为DEBUG的信息输出到控制台-->
<appender name="LOG.DEBUG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/debug.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
<!--将级别为INFO的信息输出到控制台-->
<appender name="LOG.INFO" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/info.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<!--将级别为WARN的信息输出到控制台-->
<appender name="LOG.WARN" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/warn.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<!--将级别为ERROR的信息输出到控制台-->
<appender name="LOG.ERROR" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/error.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!--将级别为FATAL的信息输出到控制台-->
<appender name="LOG.FATAL" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/fatal.log" />
<param name="MaxFileSize" value="5120KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} [%-5p] %c {%F:%L} - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<!--
<appender name="InitAction" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="d:/dbcon.log"/>
<param name="MaxFileSize" value="5120KB"/>
<param name="MaxFileSize" value="10" />
<param name="MaxBackupIndex" value="2" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.'log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyy-MM-dd HH:mm:ss} - %m%n"/>
<param name="ConversionPattern" value="%d{DATE} [%-5p] %c {%F:%L} - %m%n"/>
</layout>
</appender>
-->
<!--设置org.logicalcobwebs包的输出级别为INFO-->
<!--
<category name="org.logicalcobwebs">
<priority value="INFO" />
<appender-ref ref="LOG.Console" />
</category>
-->
<root>
<priority value="DEBUG"/>
<!--
<appender-ref ref="LOG.Console" />
-->
<appender-ref ref="LOG.DEBUG" />
<appender-ref ref="LOG.INFO" />
<appender-ref ref="LOG.WARN" />
<appender-ref ref="LOG.ERROR" />
<appender-ref ref="LOG.FATAL" />
</root>
</log4j:configuration>
c.使用Threshold属性。如:log4j.appender.R.Threshold = INFO
而它的作用是输出INFO级别以上的内容,所以info.log文件中包含了ERROR级别的文件。
所以不满足要求,还需要定义自己的Appender类,继承DailyRollingFileAppender,改写针对Threshold 的设置说明。
源代码记载
public boolean isAsSevereAsThreshold(Priority priority)
{
return threshold == null || priority.isGreaterOrEqual(threshold);
}
重写 isAsSevereAsThreshold(Priority priority)方法
public class LogAppender extends DailyRollingFileAppender {
@Override
public boolean isAsSevereAsThreshold(Priority priority) {
//只判断是否相等,而不判断优先级
return this.getThreshold().equals(priority);
}
}
所以,b方法是最简单的。c方法中使用了自定义Appender,下篇文章介绍如何自定义Appender。
其实c方法中不覆盖isAsSevereAsThreshold(Priority priority)方法,覆盖append方法也是可以的,如下例子实现了,只输出DEBUG级别日志。
@Override
public void append(LoggingEvent event) {
if(!"DEBUG".equals(event.getLevel().toString())){
return;
}
System.out.println(this.getLayout().format(event));
//System.out.println("LEVEL="+event.getLevel());
//System.out.println("message="+event.getMessage());
}
这种方式楼主亲测过,而且不用Threshold 属性。
分享到:
相关推荐
5. **日志分级**:遵循日志级别的标准(TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF),Log4j-core-2.5可以方便地控制不同级别日志的输出。 二、SLF4J接口的集成 SLF4J(Simple Logging Facade for Java)是一个...
- **配置日志**:创建`log4j2-spring.xml`配置文件,定义日志级别、输出格式、Appender等。例如: ```xml <?xml version="1.0" encoding="UTF-8"?> [%t] %-5level %logger{36} - %msg%n"/> ...
2. **日志分级**:根据模块或类设置不同级别的日志,便于定位问题。 3. **日志归档**:使用DailyRollingFileAppender实现日志自动滚动和归档。 4. **异常堆栈追踪**:在ERROR级别下,log4j会自动打印出完整的异常...
四、使用Log4j 在Java代码中,通过`Logger`类获取logger实例,然后调用相应的方法进行日志记录: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = ...
Log4j 2.0的一大亮点是支持动态配置更新,这意味着在应用程序运行时,无需重启即可更改日志级别、布局和输出目的地,这极大提升了灵活性和响应速度。 **3. 性能优化** 相比Log4j 1.x,Log4j 2.0在性能上有显著提升...
### 基于Log4J的日志输出组件...该组件通过合理的日志分级机制和灵活的输出方式,为系统的维护和审计提供了有力的支持。对于类似AMSystem这样的大型信息系统而言,一个高效稳定且易于扩展的日志输出组件是必不可少的。
Log4j是Java平台上广泛使用的日志记录框架,它的全称是Apache Log4j,它为应用程序提供了灵活的日志记录功能。在Java开发中,日志记录是非常关键的一部分,可以帮助开发者跟踪程序运行状态,定位错误,进行性能分析...
本话题将深入探讨"用到的两个log4j日志架包"——`android-logging-log4j-1.0.3.jar`和`log4j-1.2.15.jar`。 首先,`android-logging-log4j-1.0.3.jar`是专门为Android平台设计的日志库,它是Log4j的一个变种,使得...
Log4j 不仅开源免费,还具备高度的灵活性与可配置性,支持多种日志输出目的地(例如控制台、文件、GUI 组件、网络套接字等)以及自定义的日志信息格式。更重要的是,Log4j 通过定义日志级别(例如 FATAL、ERROR、...
【hibernate-log4j日志】专题详细解析 日志框架在软件开发中起着至关重要的作用,尤其是在Java世界中。本文将深入探讨Hibernate框架与Log4j的结合使用,帮助开发者更好地理解和运用日志功能。 **简介** 日志记录...
首先,Log4j的核心组件包括Logger(日志器)、Appender(输出目的地)和Layout(格式化策略)。在这个例子中,我们关注的是Appender配置,特别是如何设置日志文件的路径为相对路径。 1. **配置文件**:Log4j的配置...
在"slf4j-1.6.1"这个版本中,SLF4J提供了各种绑定(binding)以适配不同的日志实现,例如log4j-slf4j-impl.jar用于将SLF4J与Log4j集成,而slf4j-jdk14.jar则用于与Java Util Logging集成。 Logback作为SLF4J的一个...
以下是Log4j的核心组成部分、使用方法以及日志分级的详细解释。 1. **LOG4J组成**: - **Logger**:是Log4j的核心,负责决定哪些日志信息应该被记录和哪些应该被忽略。它根据预定义的级别来过滤日志,由`org....
Log4j是一款广泛应用于Java平台的日志记录框架,它提供了灵活且强大的日志记录功能,使得开发者能够方便地控制日志信息的输出级别、格式以及目的地。本实例将深入探讨Log4j的基本使用方法和配置。 一、Log4j的核心...
- 配置文件通常为`log4j.properties`或`log4j.xml`,用于定义日志的级别、输出目的地、格式等。 - 日志级别包括DEBUG、INFO、WARN、ERROR、FATAL,开发者可以根据需要设置不同级别的日志输出。 3. **Logger的使用...
相比`System.out.println`,Log4j具有许多优势,例如它允许在运行时动态地打开或关闭日志,可以选择特定包或类的日志输出,可以对日志进行分级,支持多种输出格式,甚至可以将日志信息输出到不同的位置。 要开始...
- **Logger**: 日志记录器是Log4j的核心组件,负责实际的日志输出。它可以根据级别(如DEBUG、INFO、WARN、ERROR、FATAL)控制日志信息的生成。 - **Appender**: 输出目的地,定义日志信息输出到哪里,比如控制台、...
从Log4j升级到Log4j2,可以享受到更高效的日志处理、异步日志记录、动态配置以及支持JSON和XML等格式的日志输出。 在Struts2.3到Struts2.5的升级中,首先需要确保所有依赖的jar文件都与新版本兼容。这包括Struts2的...
Log4j不仅提高了代码的可读性和可维护性,还允许开发者根据需要调整日志输出的级别,从而实现不同环境下的日志管理。 **Log4j的基本组件** 1. **Logger**: 这是日志记录的主要接口,用于生成日志消息。开发者可以...
- **日志级别设定**:Log4j支持自定义日志的最低输出级别,如`log4j.rootLogger=INFO`表示所有低于INFO级别的日志将被忽略。 - **日志类别配置**:可以针对特定的类设定日志级别,如`log4j.logger....