LevelRangeFilter的注意点

在log4j2中,LevelRangeFilter的minLevel,maxLevel的配置是和log4j 1.x相反的;minLevel需要配置的是高级别,maxLevel配置的是低级别,如下:

<LevelRangeFilter minLevel="fatal" maxLevel="info" onMatch="ACCEPT" onMismatch="DENY"/>

如上边的配置,是打印info到fatal级别的log,如果配置反过来,则不会输出任何log。

如果不配置minLevel、maxLevel、onMatch和onMismatch的值,则会为其设置默认值,在LevelRangeFilter中的源码实现如下:

@PluginFactory
public static LevelRangeFilter createFilter(
// @formatter:off
@PluginAttribute("minLevel") final Level minLevel,
@PluginAttribute("maxLevel") final Level maxLevel,
@PluginAttribute("onMatch") final Result match,
@PluginAttribute("onMismatch") final Result mismatch) {
// @formatter:on
final Level actualMinLevel = minLevel == null ? Level.ERROR : minLevel;
final Level actualMaxLevel = maxLevel == null ? Level.ERROR : maxLevel;
final Result onMatch = match == null ? Result.NEUTRAL : match;
final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
return new LevelRangeFilter(actualMinLevel, actualMaxLevel, onMatch, onMismatch);
}

至于为什么把最大最小level的值配置反了就会无法输出,是因为在LevelRangeFilter中的源码实现如下:

private Result filter(final Level level) {
return level.isInRange(this.minLevel, this.maxLevel) ? onMatch : onMismatch;
}

可以看到,在调用filter方法进行过滤时,是调用了level#isInRange()来判断是否匹配该filter的。而在该方法中,实现如下:

public boolean isInRange(final Level minLevel, final Level maxLevel) {
return this.intLevel >= minLevel.intLevel && this.intLevel <= maxLevel.intLevel;
}

这里通过对比Level对象的intLevel值(int)来判断是否匹配,而这些Level对象也在Level这个类里进行里实例化:

static {
OFF = new Level("OFF", StandardLevel.OFF.intLevel());
FATAL = new Level("FATAL", StandardLevel.FATAL.intLevel());
ERROR = new Level("ERROR", StandardLevel.ERROR.intLevel());
WARN = new Level("WARN", StandardLevel.WARN.intLevel());
INFO = new Level("INFO", StandardLevel.INFO.intLevel());
DEBUG = new Level("DEBUG", StandardLevel.DEBUG.intLevel());
TRACE = new Level("TRACE", StandardLevel.TRACE.intLevel());
ALL = new Level("ALL", StandardLevel.ALL.intLevel());
}

可以看到,这些Level对象的intLevel值是由另一个枚举类StandardLevel来提供的:

/**
* No events will be logged.
*/
OFF(0), /**
* A severe error that will prevent the application from continuing.
*/
FATAL(100), /**
* An error in the application, possibly recoverable.
*/
ERROR(200), /**
* An event that might possible lead to an error.
*/
WARN(300), /**
* An event for informational purposes.
*/
INFO(400), /**
* A general debugging event.
*/
DEBUG(500), /**
* A fine-grained debug message, typically capturing the flow through the application.
*/
TRACE(600), /**
* All events should be logged.
*/
ALL(Integer.MAX_VALUE);

可以看到,Level级别越高,其对应的intLevel值越小,可以这样理解:级别越高,能打印出来的日志信息就越少,所以其intLevel值就越小。

如果我们把LevelRangeFilter的minLevel、maxLevel配置反了,会导致level#isInRange()返回false,最终也就没有任何日志得以输出了。

log4j2中LevelRangeFilter的注意点的更多相关文章

  1. Log4j2中的同步日志与异步日志

    1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日 ...

  2. Log4j2中RollingFile的文件滚动更新机制

    一.什么是RollingFile RollingFileAppender是Log4j2中的一种能够实现日志文件滚动更新(rollover)的Appender. rollover的意思是当满足一定条件( ...

  3. Log4j2 中format增加自定义的参数

    首先收藏一下log4j2的官网:http://logging.apache.org/log4j/2.x/manual/plugins.html#TypeConverters 对于这种需要,可以使用lo ...

  4. Log4j2 - 日志框架中isDebugEnabled()的作用

    为什么要使用isDebugEnabled() 之前在系统的代码中发现有时候会在打印日志的时候先进行一次判断,如下: if (LOGGER.isDebugEnabled()) { LOGGER.debu ...

  5. log4j 和 log4j2 在springboot中的性能对比

    文章链接: https://pengcheng.site/2019/11/17/log4j-he-log4j2-zai-springboot-zhong-de-xing-neng-dui-bi/ 前言 ...

  6. Spring Boot Log4j2 日志学习

    简介 Java 中比较常用的日志工具类,有: Log4j. SLF4j. Commons-logging(简称jcl). Logback. Log4j2(Log4j 升级版). Jdk Logging ...

  7. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  8. Spring Boot 整合 slf4j+log4j2 实现日志管理

    背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...

  9. 详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出

    1. 按日志级别区分文件输出 有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现. 假定需求是把 ...

随机推荐

  1. atol的实现【转】

    本文转载自:http://blog.csdn.net/cwqbuptcwqbupt/article/details/7518582 看了atol的实现,发现char到int的转换比较奇怪:c = (i ...

  2. 有待总结的KMP算法 sdut oj 2463 学密码学一定得学程序

    学密码学一定得学程序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 曾经,ZYJ同学非常喜欢密码 学.有一天,他发现了一个很长很 ...

  3. UVA1025 A Spy in the Metro —— DP

    题目链接: https://vjudge.net/problem/UVA-1025 题解: 详情请看紫书P267. 与其说是DP题,我觉得更像是模拟题,特别是用记忆化搜索写. 递推: #include ...

  4. c/c++通用内存泄漏检测框架GMFD(General Memory Fault Detection Framework)

    http://qa.baidu.com/blog/?p=171 1 背景: x86平台有完善的用户态检测内存工具比如valgrind等,可以监控程序运行中详细的内存信息,从而精确定位内存问题.然而随着 ...

  5. blog.codedream.ren

    博客将转到 CodeDream  ,新的链接是 http://blog.codedream.ren

  6. 003 - 修改Pycharm的项目文件树样式

    相信习惯了Eclipse或者Windows的小伙伴对于Pycharm的目录树一定觉得特别别扭 因为它总是在文件前加一个三角形标注, 这样的标注在视觉上十分误导层级关系 修改的方式为   File -& ...

  7. Linux服务:使用Supervisor管理进程

    一.简介 由于基本每个公司都会用到supervisor这个进程管理工具,这里简单阐述一下. Supervisor (http://supervisord.org) 是一个用Python写Linux下的 ...

  8. ubuntu 16.04 apt-get 出现The package 'xxx' needs to be reinstalled, but I can't find an archive for it.

    参考网址:http://www.ihaveapc.com/2011/10/fix-annoying-the-package-needs-to-be-reinstalled-but-i-cant-fin ...

  9. poj1639顶点度限制生成树

    题目:http://poj.org/problem?id=1639 对根的度数有限制的最小生成树: 先忽略根,跑最小生成树,得到几个连通块,再一一与根连上: 然后在限制内用根连出去的边来使生成树更小, ...

  10. centos7 安装 python3.5

    centos7 安装 python3.5 一. python虚拟环境virtualenv VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前 ...