2010-10-20 5 views
3

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

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

ответ

2

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

+0

Не совсем то, на что я надеялся, но спасибо за информацию. Если никто больше не даст лучшего ответа в течение недели, я соглашусь с этим. – Jonathan

10

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

+0

Спасибо, миллион! Ваш мост и решение избавили меня от многих неприятностей. –

Смежные вопросы