Как перенаправить javax.mail.Session setDebugOut в log4j logger? - PullRequest
8 голосов
/ 22 января 2010

Как перенаправить javax.mail.Session setDebugOut в log4j logger?

Можно ли перенаправить только отладчик mailSession в логгер?

Я имею в виду, есть такие решения, как

текст ссылки

, который переназначает все стандартные выходные данные для перехода на log4j

- System.setOut (новый Log4jStream ())

С наилучшими пожеланиями

Ответы [ 3 ]

10 голосов
/ 09 июля 2011

Библиотека Apache Commons Exec содержит полезный класс LogOutputStream , который можно использовать именно для этой цели:

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

кошка, очевидно, log4j Категория / Appender.

3 голосов
/ 14 марта 2013

я создал собственный фильтрoutputstream (вы также можете использовать org.apache.logging.Logger вместо 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 });
            }
    }

затем я перенаправил javamail на мой вывод

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

, который сделал трюк:)

2 голосов
/ 28 января 2010

Напишите свой собственный класс OutputStream

и

mailSession.setDebugOut (new PrintStream (ваш пользовательский объект потока вывода));

...