Maven Plugin Logger Совместимость - PullRequest
5 голосов
/ 20 октября 2010

Я пишу плагин Maven (Mojo), который импортирует библиотеку Jar, используемую другими проектами. По крайней мере один из классов в этой библиотеке использует Apache Log4j для ведения журнала, но Log4j не будет должным образом настроен регистратором, который Maven предоставляет Mojo.

Есть ли простой способ соединить их? К сожалению, org.apache.log4j.Logger и org.apache.maven.logging.Log не имеют общего суперинтерфейса или суперкласса, поэтому я не могу просто иметь функцию типа setLog(). Любые предложения будут приветствоваться; в настоящее время я планирую либо просто проигнорировать это, либо написать класс моста, который может использовать либо.

Ответы [ 2 ]

12 голосов
/ 05 августа 2011

У меня была та же проблема, и я решил написать простой мост через 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 я использовал BasicConfigurator класс Log4j API, с экземпляром этого моста:

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

Я не знаю, если в инфраструктуре Maven уже есть этот мост, я не пытался искать что-то более "похожее на maven", но это решение работало нормально.

2 голосов
/ 26 октября 2010

Если вы хотите написать класс моста, посмотрите на источники SLF4J: http://www.slf4j.org/legacy.html#log4j-over-slf4j Они делают нечто очень похожее в своем мосте log4j.

...