【问题标题】:JavaMail setDebug(true)JavaMail 设置调试(真)
【发布时间】:2012-09-23 21:15:55
【问题描述】:

如何在 JavaMail 会话中 setDebug(true) 捕获流并在我的日志框架中使用它? (下载源代码,更改方法以接受流作为参数,重新编译它,...)

更一般地说,Java 中是否有一种以这种方式“劫持并重定向”通用流输出的标准方法?请注意,System.out 可能已经被其他输出污染了,我不知道如何“过滤”...

【问题讨论】:

    标签: java stream jakarta-mail


    【解决方案1】:

    您可以将 PrintStream 链接到 ByteArrayOutputStream,告诉 JavaMail 使用您的 PrintStream,执行 JavaMail 的工作,最后将 ByteArrayOutputStream 的内容转储到您最喜欢的记录器。

            ByteArrayOutputStream os = new ByteArrayOutputStream();
            PrintStream ps = new PrintStream(os);
            Session mailSession = Session.getDefaultInstance(props, null);
            try {
               if (MAIL_DEBUG) {
                    logger.info("JAVAMAIL debug mode is ON");
                    mailSession.setDebugOut(ps);
                    mailSession.setDebug(true);  
                }
                ...
                transport.close();
                if (MAIL_DEBUG) {
                    logger.info(os);
                }
            }
              finally {
                ps.close();
                os.close();
            }
    

    【讨论】:

    • 一旦我将它设置为流式传输并将调试保留在记录器中,它就不再显示在控制台中。有没有办法确保 setdebug 同时显示在控制台上?
    • @daredevil,也许在if (MAIL_DEBUG) 中添加System.out.println(os.toString());
    • 我做到了。我试图在命令提示符下将它作为 jar 文件运行,它没有输出到控制台。诡异的? MAIL_DEBUG 在哪里声明?我没有使用 if 语句。
    • MAIL_DEBUG 只是您定义的一个标志,用于控制程序的调试模式。它不是 JavaMail 的一部分。也许试试System.err.println(os.toString());
    • 我添加了这个System.out.print("Email sent successfully\n");,它设法在命令提示符下打印出来,而不是os.tostring
    猜你喜欢
    • 2021-12-04
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多