Maven插件记录器兼容性

时间:2010-10-20 16:27:11

标签: java maven-2 logging log4j mojo

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

有没有简单的方法来弥合这些?不幸的是,org.apache.log4j.Loggerorg.apache.maven.logging.Log不共享一个共同的超级接口或超类,所以我不能简单地使用setLog()类型的函数。欢迎大家提出意见;目前我计划要么忽略它,要么写一个可以使用它的桥接类。

2 个答案:

答案 0 :(得分:12)

我遇到了同样的问题并解决了在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”的东西,但这个解决方案运行良好。

答案 1 :(得分:2)

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