Logback:动态更改特定程序包中每个类的日志级别

dgu*_*pta 5 java logging logback slf4j

我正在使用SLF4J + Logback的项目中工作,希望能够找到一种通过使用REST API调用来配置不同范围的日志级别的方法。该调用接收具有范围(类,包或根路径)和所需日志记录级别的对象。我项目中具有记录器的每个类都使用一个静态的Logback记录器。

我使用了其他Stack Overflow答案和Logback手册来找到解决方案,以更改单个类的日志记录级别:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger target = loggerContext.getLogger(DESIRED_CLASS_PATH);
target.setLevel(DESIRED_LOGGING_LEVEL);
Run Code Online (Sandbox Code Playgroud)

这适用于该班。但是,我尝试使用根记录器更改项目中所有类的所有记录器,方法是:

Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(DESIRED_LOGGING_LEVEL);
Run Code Online (Sandbox Code Playgroud)

这只会更改根记录器,并且当我尝试打印项目中任何类的日志级别时,它都不是所需的日志级别。我尝试在logback.xml文件中声明一个记录器,该记录器声明了一个包记录器(包含所有我的类和子包的包),并尝试修改它以更改子类记录器,但这没有用。这是我的logback.xml文件:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>

    <logger name="my.uppermost.package" level="info" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我是否误解了Logback的代码或功能?如果不是,是否可以输入我的REST API调用的程序包路径,并更新该程序包中包含的类的所有记录器?

提前致谢。

Thi*_*ien 4

您可以获取现有记录器的列表并按名称过滤它们:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

for(logger : loggerContext.getLoggerList()) {
 if(logger.getName().startWith("my.target.package.")) {
  logger.setLevel(DESIRED_LOGGING_LEVEL);
 }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它只会更改已存在的记录器的日志级别。如果 my.target.package 中的某个对象稍后注册记录器,则其日志级别将是 logback.xml 中配置的任何级别