Java GlassFish:电子邮件日志处理程序
我们需要从GlassFish v3.1.2.2中的日志处理程序发送邮件 我们尝试使用smtphandler-0.6和-0.7,但效果有限。我们将jarfile安装到domain/lib/ext,并在domain/config/logging.properties中配置smtphandler的属性。我们尝试了两种方法来满足smtphandler对邮件导入的依赖:1)编辑其清单类路径以指向../../../../../../modules/javax.mail.jar,以及2)将javax.mail.jar放在域/lib/ext中与smtphandler jar一起。(我们更喜欢前一种方法,以便在整个系统中使用相同的javamail类。但这似乎没有什么区别,也不可行。) 对于这两种安排中的任何一种,行为都是相同的:Java GlassFish:电子邮件日志处理程序,java,logging,glassfish,jakarta-mail,Java,Logging,Glassfish,Jakarta Mail,我们需要从GlassFish v3.1.2.2中的日志处理程序发送邮件 我们尝试使用smtphandler-0.6和-0.7,但效果有限。我们将jarfile安装到domain/lib/ext,并在domain/config/logging.properties中配置smtphandler的属性。我们尝试了两种方法来满足smtphandler对邮件导入的依赖:1)编辑其清单类路径以指向../../../../../../modules/javax.mail.jar,以及2)将javax.mail
- 处理程序加载ok,如JVM的verbose:class输出所示李>
- 有时,它会发送邮件,询问在域启动期间发生的错误和警告(如过期的证书)。其他情况下,在发送邮件之前,它会失败,如下所述李>
- 一旦我们部署了应用程序并记录了一些应用程序错误,它就会失败。我们可以看出处理程序被调用了——这可以通过调试器和一些基本的System.out“日志记录”来证明
- 我们是否将处理程序部署到正确的位置(domain/lib/ext)
- 为什么它(有时)在(空的,没有应用程序的)域启动期间发送邮件,但应用程序发出的日志失败?当然,这是一种竞争条件,但是那些线程在做什么,偶尔会工作一段时间,然后可靠地失败呢
- 我们是否正确地认为所有这些指示一起意味着类加载问题
提前感谢您的帮助。似乎有人为此报告了一个bug。这个问题是由JavaMail团队提出的,而JavaMail团队是其下属的。升级glassfish中的JavaMail模块和部署的所有其他副本应该可以纠正这个问题。使用“glassfish/bin/asadmin start domain-v”启动glassfish也很有帮助,这样您就可以看到所有引导消息 •我们是否将处理程序部署到正确的位置(domain/lib/ext) 对。您可以部署到domain/lib/ext,但必须包含JavaMail 1.5.3,以便找到正确的传输服务。否则,您可以将jar部署到modules dir并添加,以使smtphandler看起来像一个服务。这可以通过包括新的jar或修改现有的smtphandler jar来实现 对于GlassFish 3,必须添加包含以下内容的文件
META-INF/infant/default
:
class=smtphandler.SMTPHandler,index=java.util.logging.Handler
[smtphandler.SMTPHandler]
contract={java.util.logging.Handler}
scope=javax.inject.Singleton
对于GlassFish 4,必须添加包含以下内容的文件META-INF/hk2 locator/default
:
class=smtphandler.SMTPHandler,index=java.util.logging.Handler
[smtphandler.SMTPHandler]
contract={java.util.logging.Handler}
scope=javax.inject.Singleton
然后,jar必须与升级javax.mail.jar一起放在glassfish/modules
文件夹中
另一个选项是将smtphandler子类化,使其看起来像HK2日志处理程序服务,并添加preDestroy方法以在关闭时触发电子邮件。《Oracle GlassFish Server 3.1管理指南》第一部分第7节对此进行了描述,标题为
在GlassFish 4下,需要在logging.properties中找到处理程序。放置在domain/lib/ext
中的处理程序使用属性文件中的标准Handlers
键。使用属性文件中的handlerServices
键加载作为HK2服务放置在glassfish/modules
中的处理程序
#GF3 ext/endorsed or OSGI. GF4 ext/endorsed only.
handlers=smtphandler.SMTPHandler
#GF4 OSGI only, 'handlerServices' should not contain any whitespace characters between handlers.
handlerServices=com.sun.enterprise.server.logging.GFFileHandler,smtphandler.SMTPHandler
•为什么它(有时)在(空的,没有应用程序)域启动期间发送邮件,但应用程序发出的日志失败?当然,这是一种竞争条件,但是那些线程在做什么,偶尔会工作一段时间,然后可靠地失败呢
GF记录的消息与您的web应用之间的差异。JavaMail中使用CCL来定位传输。修补“sendBuffer”方法应修复以下行为:
@Override
protected void sendBuffer() {
final Thread thread = Thread.currentThread();
ClassLoader ccl = null;
try {
ccl = thread.getContextClassLoader();
thread.setContextClassLoader(
javax.mail.Transport.class.getClassLoader());
} catch (SecurityException ignore) {
}
try {
super.sendBuffer();
} finally {
try {
thread.getContextClassLoader();
thread.setContextClassLoader(ccl);
} catch (SecurityException ignore) {
}
}
}
•我们是否正确地认为所有这些指示一起意味着类加载问题
对。真正使这项工作正常的唯一方法是将smtphandler子类化或修补,使其看起来像HK2组件,并修改CCL
我们需要从GlassFish v3.1.2.2中的日志处理程序发送邮件。
我们尝试使用smtphandler-0.6和-0.7,但效果有限
免责声明:我是JavaMail项目的内容开发者
smtphandler的替代方案是JavaMail参考实现中包含的
在GlassFish4下,必须有GlassFish/modules/javax.mail.jar
,也就是说。更新版本可从下载,并可用于替换与GlassFish捆绑的版本
接下来,您必须修改域的logging.properties
。这里是一个示例配置,您可以包括它来开始
#Ensure no whitespace between handler class names.
handlerServices=com.sun.enterprise.server.logging.GFFileHandler,com.sun.mail.util.logging.MailHandler
com.sun.mail.util.logging.MailHandler.subject=com.sun.mail.util.logging.CollectorFormatter
#com.sun.mail.util.logging.CollectorFormatter.format=GlassFish 4.x:{0}{1}{2}{4,choice,-1#|0#|0<... {4,number,integer} more}
#com.sun.mail.util.logging.CompactFormatter.format=[%4$-7.7s] %7$#.140s
com.sun.mail.util.logging.MailHandler.level=WARNING
com.sun.mail.util.logging.MailHandler.filter=com.sun.mail.util.logging.DurationFilter
com.sun.mail.util.logging.MailHandler.pushLevel=WARNING
com.sun.mail.util.logging.MailHandler.mail.smtp.host=some-smtp-host
#com.sun.mail.util.logging.MailHandler.mail.user=some-user
#com.sun.mail.util.logging.MailHandler.authenticator=some-password
com.sun.mail.util.logging.MailHandler.mail.from=app@server.com
#com.sun.mail.util.logging.MailHandler.mail.sender=team@list.com
com.sun.mail.util.logging.MailHandler.mail.to=devs@bugfixers.com
com.sun.mail.util.logging.MailHandler.verify=resolve
com.sun.mail.util.logging.MailHandler.mail.smtp.quitwait=false
com.sun.mail.util.logging.MailHandler.mail.smtps.quitwait=false
com.sun.mail.util.logging.MailHandler.mail.smtp.connectiontimeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtps.connectiontimeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtp.timeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtps.timeout=45000