有没有办法配置log4j忽略具有正则表达式(REGEX)的子包?

时间:2015-04-28 19:12:20

标签: regex logging log4j

我在我的应用程序中使用log4j。

如果我想打开一个包的日志记录,我可以简单地在[在我的log4j.properties文件中]执行以下操作: log4j.logger.com.myorg.somepackage= DEBUG 这将导致log4j记录来自" com.myorg.somepackage"的任何消息。到我的根记录器。

我的问题是,如果我使用像maven shade这样的插件,如何停止从包中记录?

例如,让我们说你有包" com.myorg.somepackage"它被重新定位(通过maven shade插件)到" com.someotherorg.dependency.com.myorg.somepackage"。

如果我想设置警告级别,我知道我可以执行以下操作: log4j.logger.com.someotherorg.dependency.com.myorg.somepackage= WARN

但是,在我的情况下,多个项目的依赖关系是阴影,我不想要: log4j.logger.com.someotherorg.dependency.com.myorg.somepackage= WARN log4j.logger.com.someotherorg1.dependency.com.myorg.somepackage= WARN log4j.logger.com.someotherorg2.dependency.com.myorg.somepackage= WARN ...等

那我怎么能让log4j忽略" com.myorg.somepackage"无论包装名称在哪里?有什么样的REGEX我不知道为此吗?

我想做的事情是这样的: log4j.logger.*.com.myorg.somepackage= WARN 但那不起作用。

1 个答案:

答案 0 :(得分:0)

我无法在log4j中找到默认功能,但log4j允许您创建自己的过滤器。

以下是我要解决的问题:

import org.apache.log4j.Level; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent;

公共类CustomFilterer扩展了Filter {

@Override
public int decide(LoggingEvent event) {
    if (!event.getLoggerName().contains("com.myorg.somepackage")) {
        return Filter.NEUTRAL;
    } else {
        if (event.getLevel().isGreaterOrEqual(Level.WARN)) {
            return Filter.NEUTRAL;

        } else {
            return Filter.DENY;
        }
    }
}

} `