【问题标题】:How to temporarily disable protocol tracing during a JavaMail IMAP connection如何在 JavaMail IMAP 连接期间临时禁用协议跟踪
【发布时间】:2015-11-06 05:56:34
【问题描述】:

您可以在为您的Session 设置Properties 时(通过将"mail.debug" 属性设置为"true")或在执行存储之前调用Session.setDebug 来指定JavaMail 是否发出协议级跟踪连接。

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

一个Protocol.suspendTracing 方法。它确实允许您暂时关闭协议跟踪输出。一堆 IMAP 身份验证方法使用它来将您的凭据保存在日志文件之外。但是suspendTracingprotected,所以它不能从普通用户代码中调用。

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

【问题讨论】:

    标签: debugging jakarta-mail


    【解决方案1】:

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

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

    【讨论】:

    • 作为记录,您能否扩展您的答案以指明用于切换日志级别的记录器的名称?
    • 记录器名称在javadocs 中。滚动到每个包的包 javadocs 底部。
    • 对于具有单个 JavaMail IMAP 连接的应用程序,这些似乎是合理的解决方案。在一次维护/创建与大量服务器的 IMAP 连接的应用程序中,如何控制一个连接的调试日志记录?即without instantiating a separate Session object for each connection
    • 在我的代码中不使用字母“e”怎么办?如果您不断添加足够的要求,答案将是不可能的! :-) 如果您已经证明在您的应用程序中每个连接使用单独的会话的性能是不可接受的,那么我没有一个简单的答案给您。您可以创建自己的 SocketFactory 并进行自己的套接字级别日志记录。您会错过所有 JavaMail 调试输出,但也许这已经足够满足您的需要了。或者编写自己的 LogManager,使用每个连接多路复用的 Logger。
    • 我想我是在指出您的解决方案更像是一种解决方法,并且希望有一种不同的 API 级别的方法来关闭单个连接的日志记录。但这应该在 JavaMail 增强请求中解决,我会去归档一个。 (尽管如果每个连接的 Session 对象不像 bug 6278 所说的那样昂贵,那是一个真正的解决方案。)
    【解决方案2】:

    不是最好的解决方案,但您可以在 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;
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2018-11-04
      • 2011-04-26
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多