2010-01-22 18 views
8

Cómo redirigir javax.mail.Session setDebugOut a log4j logger?¿Cómo redireccionar javax.mail.Session setDebugOut a log4j logger?

¿Es posible redireccionar solo mailSession a depurar al registrador?

quiero decir, hay soluciones como

link text

la que reasigna todas las salidas estándar para ir a LOG4J

--System.setOut (nueva Log4jStream())

Saludos

+1

Acabo de tropezar con esta publicación anterior. Ahora también existe la opción de simplemente usar un puente jul-> slf4j 'java.util.logging.Logger.getLogger (" javax.mail ")' sin usar la opción de depuración PrintStream. –

Respuesta

2

Escriba su propia clase OutputStream

y

mailSession.setDebugOut (nuevo PrintStream (su objeto de flujo de salida personalizado));

10

Apache Commons Exec biblioteca contiene clase útil LogOutputStream, que se puede utilizar para este propósito exacto:

LogOutputStream losStdOut = new LogOutputStream() {    
    @Override 
    protected void processLine(String line, int level) { 
     cat.debug(line); 
    } 
}; 

Session session = Session.getDefaultInstance(new Properties(), null); 
session.setDebugOut(new PrintStream(losStdOut)); 

gato es, obviamente, log4j Categoría/Appender de.

3

creé una FilterOutputStream propia (también se puede utilizar el org.apache.logging.Logger en lugar del SLF)

public class LogStream extends FilterOutputStream 
    { 
     private static org.slf4j.Logger    LOG = org.slf4j.LoggerFactory.getLogger(LogStream.class); 
     private static final OutputStream bos = new ByteArrayOutputStream(); 

     public LogStream(OutputStream out) 
      { 
       // initialize parent with my bytearray (which was never used) 
       super(bos); 
      } 

     @Override 
     public void flush() throws IOException 
      { 
       // this was never called in my test 
       bos.flush(); 
       if (bos.size() > 0) LOG.info(bos.toString()); 
       bos.reset(); 
      } 

     @Override 
     public void write(byte[] b) throws IOException 
      { 
       LOG.info(new String(b)); 
      } 

     @Override 
     public void write(byte[] b, int off, int len) throws IOException 
      { 
       LOG.info(new String(b, off, len)); 
      } 

     @Override 
     public void write(int b) throws IOException 
      { 
       write(new byte[] { (byte) b }); 
      } 
    } 

entonces redirigido la Javamail a mi salida

// redirect the output to our logstream 
javax.mail.Session def = javax.mail.Session.getDefaultInstance(new Properties()); 
def.setDebugOut(new PrintStream(new LogStream(null))); 
def.setDebug(true); 

que hizo el truco :)

Cuestiones relacionadas