Sunday, January 9, 2011

Debugging failed portlet deployments in Liferay 6 / Tomcat 6

We are migrating from a Liferay 5.2.3/Glassfish v2.1 build to Liferay 6 / Tomcat 6. Several of the portlets which are deploying properly have been failing upon deployment. Find below a list of the steps to enable a high enough level of debugging in Tomcat to facilitate the debugging of this condition.

The behaviour is that I would deploy the portlet to the Liferay /deploy folder... Liferay would deploy, Tomcat would deploy, then upon Tomcat attempting to load the servlet context after deployment the logs would show the error:

INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/TestBackEndPortlet-1.0-SNAPSHOT] has not been started
Jan 9, 2011 11:37:14 AM org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
Jan 9, 2011 11:37:14 AM org.apache.catalina.core.StandardContext start
SEVERE: Context [/TestBackEndPortlet-1.0-SNAPSHOT] startup failed due to previous errors

The steps to enable logging are are follows:

1 - Get tomcat-juli.jar and tomcat-juli-adapters.jar from the tomcat downloads page under 'extras'

2 - copy tomcat-juli.jar to %catalina_home%\bin folder (overwriting the one that is there).

3 - copy tomcat-juli-adapters.jar to %catalina_home%\lib folder

4 - create a log4j.properties file or log4j.xml file and add it to the %catalina_home%\lib folder
5 - download log4j.jar from the log4j site, copy to %catalina_home%\lib

6 - I also renamed the log4j.properties file in the %cataline_home%\webapps\ROOT\WEB-INF\classes folder to prevent any possible conflict. Not entirely sure if this is required or not.

Sample log4j.xml

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n" />
        </layout>
    </appender>

    <category name="com.ecyrd.jspwiki">
        <priority value="ERROR" />
    </category>

    <category name="com.germinus.easyconf">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.documentlibrary">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.jdbc">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.mail.service.impl.MailServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.mail.util">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.mail.util.DummyHook">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.mail.util.MailSessionFactoryBean">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.bean.BeanLocatorImpl">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portal.comm.CommLink">
        <priority value="DEBUG" />
    </category>

    <category name="com.liferay.portal.dao.jdbc.aop">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.dao.jdbc.util.DataSourceFactoryBean">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.deploy">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.deploy.hot.HookHotDeployListener">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.deploy.hot.PluginPackageHotDeployListener">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.deploy.hot.ThemeLoaderHotDeployListener">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.editor">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.editor.fckeditor.ConnectorAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.EventsProcessor">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.FixOracleAction">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.events.GarbageCollectorAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.LogMemoryUsageAction">
        <priority value="DEBUG" />
    </category>

    <category name="com.liferay.portal.events.LoginPostAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.LoginPreAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.LogoutPostAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.LogoutPreAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.LogSessionIdAction">
        <priority value="DEBUG" />
    </category>

    <category name="com.liferay.portal.events.LogThreadCountAction">
        <priority value="DEBUG" />
    </category>

    <category name="com.liferay.portal.events.ServicePreAction">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.events.ShutdownHook">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.image.ImageProcessorImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.kernel.bean.PortalBeanLocatorUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.kernel.deploy">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.kernel.servlet.PortletContextListener">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.kernel.util.JavaProps">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.kernel.util.ServerDetector">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.lucene">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.lucene.IndexWriterFactory">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.lucene.LuceneFileExtractor">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.mirage">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.model.Image">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.model.ModelHintsUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.plugin.PluginPackageUtil">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.pop">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.search.lucene.LuceneIndexSearcherImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.auth.LDAPAuth">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.ldap">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.ldap.PortalLDAPUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.permission.AdvancedPermissionChecker">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.permission.BasicPermissionChecker">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.security.permission.ResourceActionsUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.security.pwd.RegExpToolkit">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portal.service.impl.LayoutLocalServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.service.impl.PermissionLocalServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.service.impl.PortalLocalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.service.impl.PortalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.service.impl.PortletLocalServiceImpl">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portal.service.impl.ReleaseLocalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.service.impl.ResourceLocalServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.service.impl.ServiceComponentLocalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.service.impl.ThemeServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.service.persistence.PermissionPool">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.service.persistence.ResourcePool">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.FriendlyURLServlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.ImageServlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.LanguageServlet">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portal.servlet.LuceneServlet">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.servlet.MainServlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.PortalSessionListener">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.SharedSessionUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.SoftwareCatalogServlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.autologin.AutoLoginFilter">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.compression">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.doubleclick">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.layoutcache">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.sessionid.SessionIdFilter">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.sessionid.SessionIdServletRequest">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.strip">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.velocity.VelocityFilter">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring.context.ArrayApplicationContext">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring.context.PortalApplicationContext">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring.context.PortletApplicationContext">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring.context.TunnelApplicationContext">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.spring.hibernate.DialectDetector">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.struts">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.struts.MultiMessageResources">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.struts.PortalRequestProcessor">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.struts.PortletRequestProcessor">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portal.struts.StrutsURLEncoder">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.struts.StrutsUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.theme.ThemeLoader">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.tools.BaseDeployer">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.tools.PortletDeployer">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.tools.ThemeDeployer">
        <priority value="FINEST" />
    </category>

    <category name="com.liferay.portal.tools.sql.DBUtil">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.upgrade">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.util">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.util.CookieKeys">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.util.EntityResolver">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.util.MimeTypesUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.util.PortalInstances">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.util.PortalImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.velocity">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.velocity.ClassLoaderVelocityResourceListener">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.velocity.LiferayResourceLoader">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.velocity.ServletVelocityResourceListener">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.velocity.VelocityContextPool">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.verify">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.verify.VerifyUser">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portal.webdav">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portal.xml.SAXReaderImpl">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.InvokerPortlet">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.RenderRequestFactory">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.RenderResponseFactory">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.admin">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.admin.action.EditServerAction">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portlet.alfrescocontent">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.alfrescocontent.util.AlfrescoOpenSearchImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.blogs.service.impl.BlogsEntryLocalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portlet.documentlibrary.webdav">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.enterpriseadmin.action.EditUserPortraitAction">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portlet.journal">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.journal.lar.JournalContentPortletDataHandlerImpl">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.journal.service.impl.JournalContentSearchLocalServiceImpl">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portlet.journal.util.JournalUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.journal.util.PropertiesTransformerListener">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.journal.util.RegexTransformerUtil">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.portlet.journalcontent.JournalContentPortletLayoutListener">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.journalcontent.util.JournalContentUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.mail">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.portlet.messageboards.pop.MessageListenerImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.messageboards.service.impl.MBCategoryLocalServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.messageboards.service.impl.MBMessageLocalServiceImpl">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.messageboards.util.MBUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.portletconfiguration.action">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.shopping.action.PayPalNotificationAction">
        <priority value="DEBUG" />
    </category>

    <category name="com.liferay.portlet.tags.util.TagsUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.wsrp">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.portlet.wiki.importers">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.util.JNDIUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.util.dao">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.util.dao.orm.CustomSQLUtil">
        <priority value="INFO" />
    </category>

    <category name="com.liferay.util.mail">
        <priority value="WARN" />
    </category>

    <category name="com.liferay.util.servlet.ServletResponseUtil">
        <priority value="ERROR" />
    </category>

    <category name="com.liferay.wsrp">
        <priority value="ERROR" />
    </category>

    <category name="com.opensymphony.oscache">
        <priority value="ERROR" />
    </category>

    <category name="com.opensymphony.oscache.plugins.clustersupport.JavaGroupsBroadcastingListener">
        <priority value="ERROR" />
    </category>

    <category name="com.sample">
        <priority value="INFO" />
    </category>

    <category name="com.sun.faces">
        <priority value="ERROR" />
    </category>

    <category name="de.hunsicker">
        <priority value="ERROR" />
    </category>

    <category name="de.nava.informa">
        <priority value="ERROR" />
    </category>

    <category name="httpclient.wire">
        <priority value="ERROR" />
    </category>

    <category name="net.htmlparser.jericho">
        <priority value="ERROR" />
    </category>

    <category name="net.sf.ehcache">
        <priority value="ERROR" />
    </category>

    <category name="net.sf.hibernate">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.axis">
        <priority value="INFO" />
    </category>

    <category name="org.apache.bsf">
        <priority value="FATAL" />
    </category>

    <category name="org.apache.commons.digester">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.commons.beanutils">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.commons.fileupload">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.commons.httpclient">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.commons.validator">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.jackrabbit">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.myfaces">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.struts">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.struts.action.RequestProcessor">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.struts.tiles.TilesRequestProcessor">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.velocity">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.wsrp4j">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.xbean">
        <priority value="ERROR" />
    </category>

    <category name="org.hibernate">
        <priority value="ERROR" />
    </category>

    <category name="org.jabsorb">
        <priority value="ERROR" />
    </category>

    <category name="org.jgroups">
        <priority value="ERROR" />
    </category>

    <category name="org.openid4java">
        <priority value="ERROR" />
    </category>

    <category name="org.pdfbox">
        <priority value="INFO" />
    </category>

    <category name="org.portletbridge">
        <priority value="INFO" />
    </category>

    <category name="org.quartz">
        <priority value="ERROR" />
    </category>

    <category name="org.springframework">
        <priority value="ERROR" />
    </category>

    <category name="com.sun">
        <priority value="ERROR" />
    </category>

    <category name="org.apache.catalina.startup.HostConfig">
        <priority value="FINEST" />
    </category>
    
    <category name="org.apache.catalina.core.StandardContext">
        <priority value="FINEST" />
    </category>
    
    <category name="org.apache.jasper.servlet.JspServlet">
        <priority value="INFO" />
    </category>

    <root>
        <priority value="INFO" />
        <appender-ref ref="CONSOLE" />
    </root>
    
</log4j:configuration>