`
lastsoul
  • 浏览: 33170 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4j-日志分级输出

    博客分类:
  • LOG
 
阅读更多
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 属性。
分享到:
评论

相关推荐

    log4j-core-2.15.0.jar log4j-2.15.0-rc2

    Apache log4j2零日漏洞,根据 log4j-2.15.0-rc2 版本编译生成log4j-api-2.15.0.jar 1.解压你的jar jar xvf XXX.jar 2. 删除旧版本jar cd ./BOOT-INF/lib rm -rf log4j-api-*.jar 3. 上传新版本log4j-api-2.15.0....

    log4j-api-2.15.0.jar log4j-2.15.0-rc2

    Apache log4j2零日漏洞,根据 log4j-2.15.0-rc2 版本编译生成log4j-api-2.15.0.jar 1.解压你的jar jar xvf XXX.jar 2. 删除旧版本jar cd ./BOOT-INF/lib rm -rf log4j-api-*.jar 3. 上传新版本log4j-api-...

    logging-log4j2-log4j-2.15.0-rc2.zip maven 资源库

    针对Log4j 2 远程代码执行漏洞,需要用到的升级资源包,适用于maven资源库,包括log4j,log4j-core,log4j-api,log4j-1.2-api,log4j-jpa等全套2.15.0 maven资源库jar包。如果是maven本地仓库使用,需要将zip包解压...

    log4j-API-最新稳定版本log4j-1.2.17

    log4j-API-最新稳定版本log4j-1.2.17 apache log4j-API-最新稳定版本log4j-1.2.17

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    log4j-api-2.12.4.jar和log4j-core-2.12.4.jar,该版本避免log4j漏洞问题。

    log4j-to-slf4j-2.12.1-API文档-中文版.zip

    赠送jar包:log4j-to-slf4j-2.12.1.jar; 赠送原API文档:log4j-to-slf4j-2.12.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.12.1.pom; 包含翻译后...

    开发工具 log4j-core-2.3

    开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-core-2.3开发工具 log4j-...

    log4j-slf4j-impl-2.17.1-API文档-中英对照版.zip

    赠送jar包:log4j-slf4j-impl-2.17.1.jar; 赠送原API文档:log4j-slf4j-impl-2.17.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.17.1.pom; ...

    log4j-slf4j-impl-2.12.1-API文档-中文版.zip

    赠送jar包:log4j-slf4j-impl-2.12.1.jar; 赠送原API文档:log4j-slf4j-impl-2.12.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.12.1.pom; ...

    log4j-slf4j-impl-2.12.1-API文档-中英对照版.zip

    赠送jar包:log4j-slf4j-impl-2.12.1.jar; 赠送原API文档:log4j-slf4j-impl-2.12.1-javadoc.jar; 赠送源代码:log4j-slf4j-impl-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-slf4j-impl-2.12.1.pom; ...

    log4j-to-slf4j-2.10.0-API文档-中文版.zip

    赠送jar包:log4j-to-slf4j-2.10.0.jar; 赠送原API文档:log4j-to-slf4j-2.10.0-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.10.0-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.10.0.pom; 包含翻译后...

    log4j-over-slf4j-1.7.33-API文档-中英对照版.zip

    赠送jar包:log4j-over-slf4j-1.7.33.jar; 赠送原API文档:log4j-over-slf4j-1.7.33-javadoc.jar; 赠送源代码:log4j-over-slf4j-1.7.33-sources.jar; 赠送Maven依赖信息文件:log4j-over-slf4j-1.7.33.pom; ...

    log4j-over-slf4j-1.7.33-API文档-中文版.zip

    赠送jar包:log4j-over-slf4j-1.7.33.jar; 赠送原API文档:log4j-over-slf4j-1.7.33-javadoc.jar; 赠送源代码:log4j-over-slf4j-1.7.33-sources.jar; 赠送Maven依赖信息文件:log4j-over-slf4j-1.7.33.pom; ...

    log4j-api-2.12.1-API文档-中文版.zip

    赠送jar包:log4j-api-2.12.1.jar; 赠送原API文档:log4j-api-2.12.1-javadoc.jar; 赠送源代码:log4j-api-2.12.1-sources.jar; 赠送Maven依赖信息文件:log4j-api-2.12.1.pom; 包含翻译后的API文档:log4j-api-...

    log4j-api-2.17.1-API文档-中文版.zip

    赠送jar包:log4j-api-2.17.1.jar; 赠送原API文档:log4j-api-2.17.1-javadoc.jar; 赠送源代码:log4j-api-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-api-2.17.1.pom; 包含翻译后的API文档:log4j-api-...

    apache-log4j-extras-1.2.17-API文档-中文版.zip

    赠送jar包:apache-log4j-extras-1.2.17.jar; 赠送原API文档:apache-log4j-extras-1.2.17-javadoc.jar; 赠送Maven依赖信息文件:apache-log4j-extras-1.2.17.pom; 包含翻译后的API文档:apache-log4j-extras-...

    log4j-to-slf4j-2.17.1-API文档-中英对照版.zip

    赠送jar包:log4j-to-slf4j-2.17.1.jar; 赠送原API文档:log4j-to-slf4j-2.17.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.17.1.pom; 包含翻译后...

    开发工具 log4j-api-2.3

    开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3开发工具 log4j-api-2.3...

    slf4j-log4j12-1.0.jar

    slf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4j12-1.0.jarslf4j-log4...

    log4j-to-slf4j-2.17.1-API文档-中文版.zip

    赠送jar包:log4j-to-slf4j-2.17.1.jar; 赠送原API文档:log4j-to-slf4j-2.17.1-javadoc.jar; 赠送源代码:log4j-to-slf4j-2.17.1-sources.jar; 赠送Maven依赖信息文件:log4j-to-slf4j-2.17.1.pom; 包含翻译后...

Global site tag (gtag.js) - Google Analytics