当前位置: 首页 > 知识库问答 >
问题:

为特定包中的每个类动态更改日志级别

姚凯歌
2023-03-14

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

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger target = loggerContext.getLogger(DESIRED_CLASS_PATH);
target.setLevel(DESIRED_LOGGING_LEVEL);
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(DESIRED_LOGGING_LEVEL);
<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>

共有1个答案

邵弘伟
2023-03-14

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

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

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

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

 类似资料: