2013-06-04 26 views
0

使用logback-1.0.13.jar和JDK 1.6u34。Logback SMTPAppender找不到JNDI位置並啓動

我有以下WEB-INF/classes/logback.xml一個Java Web應用程序(WAR):

<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 [email protected] - 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郵件會話?這會阻止SMTPAppender啓動並能夠記錄消息。提前致謝!

回答

2

首先,不要將郵件JAR放在兩個位置,而是放在Tomcat的lib文件夾中。如果您正在使用Maven,請使用provided作用域作爲相應的<dependency />,以便將其打包到WAR中。

其次,你的web.xml郵件會話中是否有<resource-ref />元素?如果不是,請看here作爲示例。

另一種方法是從context.xml發出會話<resource />全局(在server.xml)並鏈接到它,如所述here

HTH, 尤卡

+0

感謝@Jukka(+1) - 這是重複郵件罐子畢竟! – IAmYourFaja