将 com.sun.mail 中使用 PrintStream 和 log4j 的事件记录到单独的文件中

Log events from com.sun.mail which use PrintStream with log4j into separate file

com.sun.* 包使用 PrintStream 进行日志记录。例如 class com.sun.mail.smtp.SMTPTransport

private PrintStream out;
...
if (debug)
        out.println("DEBUG SMTP: useEhlo " + useEhlo + ", useAuth " + useAuth);

是否可以使用 log4j 记录这些事件?一种解决方案是为系统输出创建代理,就像这里建议的那样:log4j redirect stdout to DailyRollingFileAppender,但问题是,会记录所有使用 PrintStream 的事件,不仅是 com.sun.mail.* 包,而且我不能只从 com.sun.* 包登录。

例如,我想将电子邮件事件记录到单独的文件中,但不能,因为某些其他 class 来自某些使用 PrintStream 的第三方库的可能性。

试试这个

log4j.appender.MAIL=org.apache.log4j.RollingFileAppender
log4j.appender.MAIL.File=/path/to/MAIL.log
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

log4j.logger.com.sun.mail=LEVEL, MAIL

将新的 MAIL appeender 附加到根记录器

log4j.rootLogger= ... , MAIL

JavaMail 1.4.7 或更新版本使用 JDK logging along with the legacy support for the printstream. The Log4j JUL Adapter can be used to capture output from JavaMail. The JavaMail API 记录每个 JavaMail 包底部的 JDK 记录器的名称。