如何在JavaMail IMAP连接期间临时禁用协议跟踪

时间:2015-05-12 21:29:10

标签: debugging javamail javax.mail

您可以指定在为Properties设置Session时(通过将"mail.debug"属性设置为"true")或通过调用,JavaMail是否会发出协议级跟踪在进行商店连接之前Session.setDebug

但是,当Protocol对象被实例化时,它会创建一个“协议”TraceLogger,该协议在协议对象的生命周期内持续存在。这似乎意味着一旦开始使用它就无法暂时禁用连接上的协议级调试日志记录。

Protocol.suspendTracing方法。并且它 允许您暂时关闭协议跟踪输出。一堆IMAP auth方法使用它来保存您的凭据不受日志文件的影响。但suspendTracingprotected,因此无法通过常规用户代码调用。

还有其他方法可以暂时关闭IMAP协议跟踪吗? (我更喜欢暂时关闭traceInput日志记录,但我可以禁用所有日志记录。)我是否需要编写和注册整个Protocol子类,以便我可以访问Protocol.suspendTracing

2 个答案:

答案 0 :(得分:1)

您可以使用Session.setDebugOut设置自己的流并从那里控制它。

如果您正在使用java.util.logging,则可以随时更改日志记录级别。

答案 1 :(得分:0)

不是最佳解决方案,但您可以在com.sun.mail.imap.protocol记录器上安装自定义日志过滤器,以检查是否允许某些特定线程生成输出。假设您的连接是一个线程的本地连接

    public class ServiceFilter implements Filter {

        private static final ThreadLocal<javax.mail.Service> id = new ThreadLocal<>();

        public static void suspendTracing(javax.mail.Service s) {
            id.set(Objects.requireNonNull(s));
        }

        public static void enableTracing(javax.mail.Service s) {
            if (s.equals(id.get())) {
                id.remove();
            }
        }

        @Override
        public boolean isLoggable(LogRecord record) {
            return id.get() == null;
        }
    }

缺点是此代码成为项目的一部分,而且是您必须管理的另一种资源。