gpt4 book ai didi

java - 是否有可能以任何方式在 slf4j 配置中使用 Spring 通配符? (不是作为根记录器!)

转载 作者:行者123 更新时间:2023-11-30 12:03:16 25 4
gpt4 key购买 nike

虽然还有其他一些类似的问题,但他们似乎都误解了关于通配符/根记录器的日志记录配置。我有一个不同的问题。

我的代码结构如下:

服务 1

com.some.package.service1
|-> subpackage1
|-> subpackage2

服务 2

com.some.package.service2
|-> subpackage1
|-> subpackage2

我想将 subpackage1 中类的所有记录器的日志级别设置为 DEBUG,同时设置 中类的所有记录器的日志级别code>subpackage2WARN 而将其余部分留在 INFO

我曾希望我能够简单地配置如下内容:

logging:
level:
com.some.package: INFO
com.some.package.*.subpackage1: DEBUG
com.some.package.*.subpackage2: WARN

不幸的是,这根本不起作用——带有通配符的配置被默默地忽略了。因为我有很多服务,所以我不想用大量的包日志记录定义来阻塞我的配置文件,这些定义在我添加新服务时也必须更新。不幸的是,更改代码结构不是我的选择。

  1. 是否可以使用 slf4j 通过简单配置或编程方式(理想情况下仅使用 slf4j API,但我可以接受特定于实现的解决方案)来做到这一点?
  2. 如果没有,是否有替代解决方案?

最佳答案

不幸的是,我设法使用特定的 Logback Classic Logger 实现来做到这一点。

最终结果是这样的:

@Component
public class PackageScanningLoggingConfiguration {

// Fields
// ...

@PostConstruct
public void postConstruct() {
initLoggingLevels();
}

private void initLoggingLevels() {
String basePackage = getBasePackage();

List<String> candidatePackageNames = Arrays.stream(Package.getPackages())
.filter(pkg -> pkg.getName().startsWith(basePackage))
.filter(pkg -> {
String packageName = pkg.getName();
return packageName.contains(subpackage1Package)
|| packageName.contains(subpackage2Package);
})
.map(Package::getName)
.collect(Collectors.toList());

candidatePackageNames.forEach(this::setConfiguredLoggingLevel);
}

private void setConfiguredLoggingLevel(final String packageName) {
// ch.qos.logback.classic.Logger;
// org.slf4j.LoggerFactory;
val logger = (Logger)LoggerFactory.getLogger(packageName);
if (logger != null) {
if (packageName.endsWith(subpackage1Package)) {
logger.setLevel(Level.toLevel(subpackage1Level));
} else if (packageName.endsWith(subpackage2Package)) {
logger.setLevel(Level.toLevel(subpackage2Level));
}
}
}

// resolve com.some.package.* to specific instance
private String getBasePackage() {
// In my case, I have only two "types" of services, so this
// returns either com.some.package.service1 or com.some.package.service2
}

}

不幸的是,由于 Logback 的内部机制,似乎要让这个解决方案起作用,我的根包 (com.some.package) 必须设置为 TRACE 并且所有其他的都必须低于那个 - 反过来似乎行不通。

因此,我不太喜欢这个解决方案(它有效,但有点奇怪)。我会暂时保留这个问题,以防有人想到更好的方法来做到这一点。

关于java - 是否有可能以任何方式在 slf4j 配置中使用 Spring 通配符? (不是作为根记录器!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57874961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com