java - Logback SMTPAppender找不到JNDI位置并启动

标签 java jndi logback context.xml smtpappender

使用logback-1.0.13.jar和JDK 1.6u34。

我有一个 Java Web 应用程序 (WAR),其中包含以下 WEB-INF/classes/logback.xml:

<configuration debug="true" scan="true" scanPeriod="5 minutes">
    <appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <asynchronousSending>false</asynchronousSending>

        <sessionViaJNDI>true</sessionViaJNDI>
        <jndiLocation>java:comp/env/mail/Session-local</jndiLocation>

        <subject>%logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
            <bufferSize>25</bufferSize>
        </cyclicBufferTracker>
    </appender>

    <root level="ALL">
        <appender-ref ref="logManager-smtpAppender" />
    </root>
</configuration>

以及以下 ${TOMCAT_HOME}/conf/context.xml(适用于所有 Web 应用程序的全局 context.xml):

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <Resource
        name="mail/Session-local"
        auth="Container"
        type="javax.mail.Session"
        mail.smtp.host="my.smtp.server"
        mail.user="smtp_user"
        mail.password="smtp_password"
        mail.transport.protocol="smtp"
        mail.smtp.auth="true"
        mail.smtp.port="25"
        mail.smtp.starttls.enable="true"
    />
</Context>

并且有 Java Mail API 1.4.3 (我已经验证它包含一个 javax.mail.Authenticator 类)在我的运行时类路径上 WEB-INF/lib/javax-mail-1.4.3.jar )。我在 Tomcat 的 lib 目录中也有它 (${TOMCAT_HOME}/lib)。

并得到以下堆栈跟踪:

13:34:09,178 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
13:34:09,179 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
13:34:09,181 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/myuser/sandbox/dsi/workbench/tomcat/6.0.32/apache-tomcat-6.0.32/webapps/myapp/WEB-INF/classes/logback.xml]
13:34:09,469 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 5 minutes
13:34:09,470 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[/home/myuser/sandbox/dsi/workbench/tomcat/6.0.32/apache-tomcat-6.0.32/webapps/myapp/WEB-INF/classes/logback.xml]] every 300 seconds. 
13:34:09,470 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
13:34:11,782 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.net.SMTPAppender]
13:34:11,830 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [logManager-smtpAppender]
13:34:11,939 |-INFO in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Looking up javax.mail.Session at JNDI location [java:comp/env/mail/Session-local]
13:34:11,992 |-ERROR in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Failed to obtain javax.mail.Session from JNDI location [java:comp/env/mail/Session-local]
13:34:11,992 |-ERROR in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Failed to obtain javax.mail.Session. Cannot start.
13:34:11,993 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ALL
13:34:11,996 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [logManager-smtpAppender] to Logger[ROOT]
13:34:11,997 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
13:34:12,000 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@63220fd1 - Registering current configuration as safe fallback point
13:39:49,988 |-WARN in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Attempted to append to non started appender [logManager-smtpAppender].
13:39:49,988 |-WARN in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Attempted to append to non started appender [logManager-smtpAppender].
13:39:50,598 |-WARN in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Attempted to append to non started appender [logManager-smtpAppender].
13:39:51,275 |-WARN in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Attempted to append to non started appender [logManager-smtpAppender].
13:39:51,833 |-WARN in ch.qos.logback.classic.net.SMTPAppender[logManager-smtpAppender] - Attempted to append to non started appender [logManager-smtpAppender].

关于为什么 Logback 无法从 Tomcat 的 context.xml 检索我的 JNDI 邮件 session 有什么想法吗?这会阻止 SMTPAppender 启动并记录消息。提前致谢!

最佳答案

首先,不要将邮件 JAR 放在两个位置,而是放在 Tomcat 的 lib 文件夹中。如果您使用 Maven,请使用 provided相应<dependency />的范围不将其打包在 WAR 中。

第二,你有<resource-ref />吗? web.xml 中邮件 session 的元素?如果没有,请查看here获取示例。

另一种选择是将 session 设为 <resource />全局(在 server.xml 中)并从 context.xml 链接到它,如上所述here .

HTH, 尤卡

关于java - Logback SMTPAppender找不到JNDI位置并启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16924231/

相关文章:

junit - 使用 JUnit 时可以避免重新定义 JNDI 数据源吗?

java - 无法连接 连接 连接关闭后不允许进行任何操作。 Tomcat 7 中的错误

java - Logback 和 Spring Boot 的新 springProperty 查找机制不起作用

java - 在 Swing 中添加组会改变水平位置

java - 保持 JInternalFrame 的焦点

java - 有 Aardvark 的 API 吗?

java - Spring webflux非阻塞响应

multithreading - JNDI 名称解析在 tomee 的新线程中失败

java - 如何打印logback的配置信息?

akka - 让 Akka 知道 Play 的 logback 配置