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

Is there a way to configure log4j to ignore subpackages with a regular expression (REGEX)?

我在我的应用程序中使用 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" 而不管它位于包名称中的什么位置?是否有某种我不知道的正则表达式?

我想做一些事情: log4j.logger.*.com.myorg.somepackage= WARN 但这不起作用。

我在 log4j 中找不到执行此操作的默认功能,但 log4j 允许您创建自己的过滤器。

这是我解决问题的方法:

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

public class CustomFilterer 扩展过滤器 {

@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;
        }
    }
}

} `