在使用javamail的时候,有时我们会打开debug,让javamail输出debug日志。但是,javamail默认是输出到System.out中,如果应用使用的是log4j或logback之类的日志框架,如何将javamail的debug日志也统一由这些日志框架来处理呢?
javamail中,日志是使用PrintStream来输出的,默认的实现是输出到System.out,如果想自行实现PrintStream类,就可以自己决定日志输出到哪里了。javamail使用到了PrintStream的println(String line)方法和wrinte(byte[] bs,int off,int len)方法,所以我们定义一个Log4JavaMail类继承PrintStream,重写这两个方法。代码地址为: https://github.com/goodjin/log4javamail.git
使用方式如下:
Log4JavaMail log4JavaMail = new Log4JavaMail(logger, "utf-8");//logger为slf4j的日志对象
Session session = Session.getInstance(props, null); // 获得邮件会话对象
session.setDebugOut(log4JavaMail); //设置将日志输出到工具类对象
session.setDebug(true);
在debug时每次都全部输出整个邮件内容可能会导致日志过多,也无必要,所以我们可以将邮件内容设置为trace级别,这里的做法是在遇到DATA命令时标记当前日志为邮件内容开始,遇到.\r\n时标记为邮件内容结束 ,当输出邮件内容时采用trace方法。
最后:这里只针对smtp发信做了日志桥接,pop3,imap协议下的做法同理。