2010-01-22 9 views
8

Wie javax.mail.Session umleiten setDebugOut zu log4j Logger?Wie javax.mail.Session umleiten setDebugOut zu log4j Logger?

Ist es möglich, nur mailSession debug out zu Logger umleiten?

Ich meine, gibt es Lösungen, wie

link text

, die alle Standardausgabe

--System.setOut (neu Log4jStream())

Beste Grüße gehen an LOG4J neu zuweist

+1

Gerade gestolpert auf diese alte Post. Es gibt jetzt auch die Option, einfach eine jul-> slf4j-Bridge 'java.util.logging.Logger.getLogger (" javax.mail ")' zu verwenden, ohne die PrintStream-Debug-Option zu verwenden. –

Antwort

2

Schreiben Sie Ihre eigene OutputStream-Klasse

und

mailSession.setDebugOut (neuer PrintStream (Ihr benutzerdefiniertes Ausgabe-Stream-Objekt));

10

Apache Commons Exec Bibliothek enthält nützliche Klasse LogOutputStream, die Sie für diesen genauen Zweck verwenden können:

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)); 

Katze log4j Kategorie/Appender ist offensichtlich.

3

i erstellt eine eigene filteroutputstream

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 }); 
      } 
    } 

dann umgeleitet ich die Java Mail zu meiner Ausgabe

// 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); 

(Sie auch die org.apache.logging.Logger anstelle des SLF verwenden könnte), dass hat den Trick gemacht :)

Verwandte Themen