You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
Seam integrates a lot of technologies: Hibernate, JSF, Ajax4Jsf, Richfaces, ... more than 10 different technologies and API to learn, which may be painful. This document explains how to configure a Seam 2.1.2.GA on Jboss 4.2.2 with log4j enabled to display meaningful and interesting information about:
These information are really important for newcomers to web technologies, JSF and Seam because they show from a global point of view how Seam makes the glue
between all these technologies: just reading the logs will reveal some of the magic
behind Seam.
To get these valuable information, you must do the following steps:
1. add a class HttpRequestDebugFilter in your src/main package:
package com.company.util; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.jboss.seam.log.Logging; public class HttpRequestDebugFilter implements Filter { org.jboss.seam.log.Log log = Logging.getLog(HttpRequestDebugFilter.class); public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // log info if (request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest)request; if (httpRequest.getRequestURI().endsWith(".seam")) { log.info("request: method="+httpRequest.getMethod()+", URL="+httpRequest.getRequestURI()); log.info(" contentType="+request.getContentType()+", characterEncoding="+request.getCharacterEncoding()+")"); log.info(" header:"); for (Enumeration<?> e=httpRequest.getHeaderNames(); e.hasMoreElements();) { String key =(String)e.nextElement(); Object value = httpRequest.getHeader(key); log.info(" "+key+" = "+value); } if (request.getParameterMap().size()>0) { log.info(" parameters:"); // sort parameters by name List<String> paramNames = new ArrayList<String>(request.getParameterMap().keySet()); Collections.sort(paramNames); for (String key : paramNames) { String[] values = request.getParameterValues(key); log.info(" "+key+" = "+Arrays.asList(values)); } } } } chain.doFilter(request, response); } public void init(FilterConfig arg0) throws ServletException { } }
2. add the HttpRequestDebugFilter to your web.xml to see POST/GET queries (order is meaningful: it must be defined as the first filter):
<filter> <filter-name>Debug filter</filter-name> <filter-class>com.company.util.HttpRequestDebugFilter</filter-class> </filter> <filter-mapping> <filter-name>Debug filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. Add the following properties in your persistence.xml file (enable Hibernate query logging):
<property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="false"/>
4. Configure your ${JBOSS_HOME}/server/default/conf/jboss-log4j.xml to set the log level:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <!-- ===================================================================== --> <!-- --> <!-- Log4j Configuration --> <!-- --> <!-- ===================================================================== --> <!-- $Id: jboss-log4j.xml 65459 2007-09-19 00:25:51Z dimitris@jboss.org $ --> <!-- | For more configuration infromation and examples see the Jakarta Log4j | owebsite: http://jakarta.apache.org/log4j --> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <!-- ================================= --> <!-- Preserve messages in a local file --> <!-- ================================= --> <!-- A time/date based rolling appender --> <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="File" value="${jboss.server.log.dir}/server.log"/> <param name="Append" value="false"/> <!-- Rollover at midnight each day --> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <!-- Rollover at the top of each hour <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/> --> <layout class="org.apache.log4j.PatternLayout"> <!-- The default pattern: Date Priority [Category] Message\n --> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/> --> </layout> </appender> <!-- A size based file rolling appender <appender name="FILE" class="org.jboss.logging.appender.RollingFileAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="File" value="${jboss.server.log.dir}/server.log"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="1"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> --> <!-- ============================== --> <!-- Append messages to the console --> <!-- ============================== --> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Target" value="System.out"/> <param name="Threshold" value="TRACE"/> <layout class="org.apache.log4j.PatternLayout"> <!-- The default pattern: Date Priority [Category] Message\n --> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> </layout> </appender> <!-- ====================== --> <!-- More Appender examples --> <!-- ====================== --> <!-- Buffer events and log them asynchronously <appender name="ASYNC" class="org.apache.log4j.AsyncAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="SMTP"/> </appender> --> <!-- EMail events to an administrator <appender name="SMTP" class="org.apache.log4j.net.SMTPAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Threshold" value="ERROR"/> <param name="To" value="admin@myhost.domain.com"/> <param name="From" value="nobody@myhost.domain.com"/> <param name="Subject" value="JBoss Sever Errors"/> <param name="SMTPHost" value="localhost"/> <param name="BufferSize" value="10"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/> </layout> </appender> --> <!-- Syslog events <appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Facility" value="LOCAL7"/> <param name="FacilityPrinting" value="true"/> <param name="SyslogHost" value="localhost"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/> </layout> </appender> --> <!-- Log events to JMS (requires a topic to be created) <appender name="JMS" class="org.apache.log4j.net.JMSAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Threshold" value="ERROR"/> <param name="TopicConnectionFactoryBindingName" value="java:/ConnectionFactory"/> <param name="TopicBindingName" value="topic/MyErrorsTopic"/> </appender> --> <!-- Log events through SNMP <appender name="TRAP_LOG" class="org.apache.log4j.ext.SNMPTrapAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="ImplementationClassName" value="org.apache.log4j.ext.JoeSNMPTrapSender"/> <param name="ManagementHost" value="127.0.0.1"/> <param name="ManagementHostTrapListenPort" value="162"/> <param name="EnterpriseOID" value="1.3.6.1.4.1.24.0"/> <param name="LocalIPAddress" value="127.0.0.1"/> <param name="LocalTrapSendPort" value="161"/> <param name="GenericTrapType" value="6"/> <param name="SpecificTrapType" value="12345678"/> <param name="CommunityString" value="public"/> <param name="ForwardStackTraceWithTrap" value="true"/> <param name="Threshold" value="DEBUG"/> <param name="ApplicationTrapOID" value="1.3.6.1.4.1.24.12.10.22.64"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d,%p,[%t],[%c],%m%n"/> </layout> </appender> --> <!-- Emit events as JMX notifications <appender name="JMX" class="org.jboss.monitor.services.JMXNotificationAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="Threshold" value="WARN"/> <param name="ObjectName" value="jboss.system:service=Logging,type=JMXNotificationAppender"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m"/> </layout> </appender> --> <!-- ================ --> <!-- Limit categories --> <!-- ================ --> <!-- Limit the org.apache category to INFO as its DEBUG is verbose --> <category name="org.apache"> <priority value="INFO"/> </category> <!-- Limit the jacorb category to WARN as its INFO is verbose --> <category name="jacorb"> <priority value="WARN"/> </category> <!-- Limit the org.jgroups category to WARN as its INFO is verbose --> <category name="org.jgroups"> <priority value="WARN"/> </category> <!-- Limit the org.quartz category to INFO as its DEBUG is verbose --> <category name="org.quartz"> <priority value="INFO"/> </category> <!-- Limit JBoss categories <category name="org.jboss"> <priority value="INFO"/> </category> --> <!-- Server stuff --> <category name="org.jboss.deployment"> <priority value="INFO"/> </category> <category name="org.jboss.resource.connectionmanager.IdleRemover"> <priority value="INFO"/> </category> <category name="org.jboss.sytem.ServiceController"> <priority value="INFO"/> </category> <category name="org.jboss.mx.loading"> <priority value="INFO"/> </category> <!-- Seam components --> <category name="org.jboss.seam"> <priority value="TRACE"/> </category> <category name="org.jboss.seam.core.Events"> <priority value="INFO"/> </category> <category name="org.jboss.seam.contexts.Contexts"> <priority value="INFO"/> </category> <category name="org.jboss.seam.contexts.FacesLifecycle"> <priority value="INFO"/> </category> <category name="org.jboss.seam.intercept.RootInterceptor"> <priority value="INFO"/> </category> <category name="org.jboss.seam.Component"> <priority value="INFO"/> </category> <category name="org.jboss.seam.deployment"> <priority value="INFO"/> </category> <category name="org.jboss.seam.util.Resources"> <priority value="INFO"/> </category> <category name="org.jboss.seam.init.Initialization"> <priority value="INFO"/> </category> <!-- project dependencies --> <category name="org.hibernate"> <priority value="INFO"/> </category> <category name="com.arjuna"> <priority value="INFO"/> </category> <category name="org.ajax4jsf"> <priority value="INFO"/> </category> <category name="org.richfaces.component.UIComponentControl"> <priority value="INFO"/> </category> <!-- Limit the JSR77 categories --> <category name="org.jboss.management"> <priority value="INFO"/> </category> <!-- Show the evolution of the DataSource pool in the logs [inUse/Available/Max] <category name="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"> <priority value="TRACE"/> </category> --> <!-- Limit the org.jboss.serial (jboss-serialization) to INFO as its DEBUG is verbose --> <category name="org.jboss.serial"> <priority value="INFO"/> </category> <!-- Decrease the priority threshold for the org.jboss.varia category <category name="org.jboss.varia"> <priority value="DEBUG"/> </category> --> <!-- Enable JBossWS message tracing <category name="org.jboss.ws.core.MessageTrace"> <priority value="TRACE"/> </category> --> <!-- | An example of enabling the custom TRACE level priority that is used | by the JBoss internals to diagnose low level details. This example | turns on TRACE level msgs for the org.jboss.ejb.plugins package and its | subpackages. This will produce A LOT of logging output. | | Note: since jboss AS 4.2.x, the trace level is supported natively by | log4j, so although the custom org.jboss.logging.XLevel priority will | still work, there is no need to use it. The two examples that follow | will both enable trace logging. <category name="org.jboss.system"> <priority value="TRACE" class="org.jboss.logging.XLevel"/> </category> <category name="org.jboss.ejb.plugins"> <priority value="TRACE"/> </category> --> <!-- | Logs these events to SNMP: - server starts/stops - cluster evolution (node death/startup) - When an EJB archive is deployed (and associated verified messages) - When an EAR archive is deployed <category name="org.jboss.system.server.Server"> <priority value="INFO" /> <appender-ref ref="TRAP_LOG"/> </category> <category name="org.jboss.ha.framework.interfaces.HAPartition.lifecycle"> <priority value="INFO" /> <appender-ref ref="TRAP_LOG"/> </category> <category name="org.jboss.deployment.MainDeployer"> <priority value="ERROR" /> <appender-ref ref="TRAP_LOG"/> </category> <category name="org.jboss.ejb.EJBDeployer"> <priority value="INFO" /> <appender-ref ref="TRAP_LOG"/> </category> <category name="org.jboss.deployment.EARDeployer"> <priority value="INFO" /> <appender-ref ref="TRAP_LOG"/> </category> --> <!-- Clustering logging --> <!-- Uncomment the following to redirect the org.jgroups and org.jboss.ha categories to a cluster.log file. <appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender"> <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> <param name="File" value="${jboss.server.log.dir}/cluster.log"/> <param name="Append" value="false"/> <param name="MaxFileSize" value="500KB"/> <param name="MaxBackupIndex" value="1"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/> </layout> </appender> <category name="org.jgroups"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> <category name="org.jboss.ha"> <priority value="DEBUG" /> <appender-ref ref="CLUSTER"/> </category> --> <!-- ======================= --> <!-- Setup the Root category --> <!-- ======================= --> <root> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </log4j:configuration>
5. That's it! As you become more confident with all the technologies behind Seam, you can lower the log level.