5

他のプロジェクトで使用されているJarライブラリをインポートするMavenプラグイン(Mojo)を作成しています。そのライブラリのクラスの少なくとも1つはロギングにApacheLog4jを使用しますが、Log4jはMavenがMojoに提供するロガーによって適切に構成されません。

これらの間を橋渡しする簡単な方法はありますか?残念ながら、共通のスーパーインターフェイスやスーパークラスを共有しorg.apache.log4j.Loggerorg.apache.maven.logging.Logいないため、単純にsetLog()型関数を使用することはできません。任意の提案を歓迎します。現在、それを無視するか、どちらかを使用できるブリッジクラスを作成することを計画しています。

4

2 に答える 2

14

私は同じ問題を抱えていて、MavenLoggerと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では、このブリッジのインスタンスでLog4jAPIの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 に答える