我在Gradle中使用SLF 4J-Log4J时没有控制台输出

d8tt03nd  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(218)

我想在我的自定义Gradle插件中配置slf 4j-log4j,但无法使其工作。日志输出不会打印到控制台
我的配置如下所示:
我在我的Gradle插件项目中的**/src/main/resources下创建了一个“log4j2.xml”**

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="Audit" fileName="./logs/audit.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="Audit"/>
        </Root>
    </Loggers>
</Configuration>

生成分级

dependencies {
    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.2'
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.2'
    implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.17.2'
}

我现在从插件调用任务

project.tasks.register('log-test') {
  Logger logger = LoggerFactory.getLogger(this.class)

  logger.info('##### INFO #####')
  logger.error('##### ERROR #####')
  logger.debug('##### DEBUG #####')
}

我只能得到error & gradle标准输出:

> Task :logtest:log-test UP-TO-DATE

BUILD SUCCESSFUL in 144ms
8 actionable tasks: 8 up-to-date
##### ERROR #####
22:50:11: Execution finished 'log-test'.

我在StaticLoggerBinder类上放置了一个断点,以检查使用了哪个实现。看起来使用的是gradle默认值,而不是log4j:

slhcrj9b

slhcrj9b1#

**不幸的是,我找到了答案:**github.com/gradle/gradle/issues/2408

另请参见:Gradle User Forums - Logging in Gradle Plugin
现在唯一的选择是替换整个日志记录:Gradle 8.0.2自定义日志记录
我编写了一个小的变通方案,这样就可以打印出我自己的类中的调试日志消息,而无需在控制台中显示所有gradle内部调试消息

import org.gradle.api.logging.LogLevel
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging

class LoggerFascade {
    private Logger log

    private static LogLevel level

    LoggerFascade(Class clazz) {
        this.log = Logging.getLogger(clazz)

    }

    static LoggerFascade getLogger(Class clazz) {
        return new LoggerFascade(clazz)
    }

    static void setLevel(LogLevel newLevel) {
        if (newLevel != level) {
            level = newLevel
        }
    }

    static LogLevel getLevel() {
        return level
    }

    void lifecyle(String message) {
        log.lifecycle(message)
    }

    // eg. trace
    void quiet(String message) {
        if(LoggerFascade.level == LogLevel.QUIET) {
            log.lifecycle(message)
        }
    }

    void debug(String message) {
        if(LoggerFascade.level == LogLevel.DEBUG) {
            log.lifecycle(message)
        }
    }

    void error(String message) {
        log.error(message)
    }
}

现在可以将日志级别设置为“debug”,并将所有来自我的自定义插件类的日志消息记录到控制台:

class CustomPlugin implements Plugin<Project> {
    private static final LoggerFascade log = LoggerFascade.getLogger(CustomPlugin.class)

    @Override
    void apply(Project project) {
      LoggerFascade.setLevel(LogLevel.DEBUG)
      log.debug("watch out, I'm a debug message :)")
    }
}

相关问题