5

我正在编写一个导入其他项目使用的 Jar 库的 Maven 插件 (Mojo)。该库中的至少一个类使用 Apache Log4j 进行日志记录,但 Maven 提供给 Mojo 的记录器不会正确配置 Log4j。

有什么简单的方法可以在这些之间架起桥梁吗?不幸的是,org.apache.log4j.Logger并且org.apache.maven.logging.Log不共享一个通用的超接口或超类,所以我不能简单地拥有一个setLog()类型函数。欢迎大家提出意见; 目前我打算要么忽略它,要么编写一个可以使用的桥接类。

4

2 回答 2

14

我遇到了同样的问题并解决了在 Maven Logger 和 Log4j 之间编写一个简单的桥梁:

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.maven.plugin.logging.Log;

public class MavenLoggerLog4jBridge extends AppenderSkeleton {
    private Log logger;

    public MavenLoggerLog4jBridge(Log logger) {
        this.logger = logger;
    }

    protected void append(LoggingEvent event) {
        int level = event.getLevel().toInt();
        String msg = event.getMessage().toString();
        if (level == Level.DEBUG_INT || level == Level.TRACE_INT) {
            this.logger.debug(msg);
        } else if (level == Level.INFO_INT) {
            this.logger.info(msg);
        } else if (level == Level.WARN_INT) {
            this.logger.warn(msg);
        } else if (level == Level.ERROR_INT || level == Level.FATAL_INT) {
            this.logger.error(msg);
        }
    }

    public void close() {
    }

    public boolean requiresLayout() {
        return false;
    }
}

在我的 Mojo 中,我使用了Log4j API 的BasicConfigurator类,以及这个桥的一个实例:

public void execute() throws MojoExecutionException {
    org.apache.maven.plugin.logging.Log mavenLogger = getLog();
    BasicConfigurator.configure(new MavenLoggerLog4jBridge(mavenLogger));
}

我不知道 Maven 基础设施是否已经有了这个桥,我没有尝试搜索更“类似 Maven”的东西,但是这个解决方案运行良好。

于 2011-08-04T20:37:38.063 回答
2

如果您想编写桥接类,请查看 SLF4J 源:http ://www.slf4j.org/legacy.html#log4j-over-slf4j 他们在 log4j 桥接器中做的事情非常相似。

于 2010-10-26T07:47:08.577 回答