Save This Page
Home » apache-tomcat-6.0.16-src » org.apache » catalina » valves » [javadoc | source]
org.apache.catalina.valves
public final class: JDBCAccessLogValve [javadoc | source]
java.lang.Object
   org.apache.catalina.valves.ValveBase
      org.apache.catalina.valves.JDBCAccessLogValve

All Implemented Interfaces:
    Lifecycle, Valve, MBeanRegistration, Contained

This Tomcat extension logs server access directly to a database, and can be used instead of the regular file-based access log implemented in AccessLogValve. To use, copy into the server/classes directory of the Tomcat installation and configure in server.xml as:

<Valve className="org.apache.catalina.valves.JDBCAccessLogValve"
driverName="your_jdbc_driver"
connectionURL="your_jdbc_url"
pattern="combined" resolveHosts="false"
/>

Many parameters can be configured, such as the database connection (with driverName and connectionURL), the table name (tableName) and the field names (corresponding to the get/set method names). The same options as AccessLogValve are supported, such as resolveHosts and pattern ("common" or "combined" only).

When Tomcat is started, a database connection (with autoReconnect option) is created and used for all the log activity. When Tomcat is shutdown, the database connection is closed. This logger can be used at the level of the Engine context (being shared by all the defined hosts) or the Host context (one instance of the logger per host, possibly using different databases).

The database table can be created with the following command:

CREATE TABLE access (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
remoteHost CHAR(15) NOT NULL,
userName CHAR(15),
timestamp TIMESTAMP NOT NULL,
virtualHost VARCHAR(64) NOT NULL,
method VARCHAR(8) NOT NULL,
query VARCHAR(255) NOT NULL,
status SMALLINT UNSIGNED NOT NULL,
bytes INT UNSIGNED NOT NULL,
referer VARCHAR(128),
userAgent VARCHAR(128),
PRIMARY KEY (id),
INDEX (timestamp),
INDEX (remoteHost),
INDEX (virtualHost),
INDEX (query),
INDEX (userAgent)
);

Set JDBCAccessLogValve attribute useLongContentLength="true" as you have more then 4GB outputs. Please, use long SQL datatype at access.bytes attribute. The datatype of bytes at oracle is number and other databases use bytes BIGINT NOT NULL.

If the table is created as above, its name and the field names don't need to be defined.

If the request method is "common", only these fields are used: remoteHost, user, timeStamp, query, status, bytes

TO DO: provide option for excluding logging of certain MIME types.

Field Summary
protected  boolean useLongContentLength    Use long contentLength as you have more 4 GB output.
    since: 6.0.15 -
 
protected  String connectionName    The connection username to use when trying to connect to the database. 
protected  String connectionPassword    The connection URL to use when trying to connect to the database. 
protected  Driver driver    Instance of the JDBC Driver class we use as a connection factory. 
protected static  String info    The descriptive information about this implementation. 
protected  LifecycleSupport lifecycle    The lifecycle event support for this component. 
Fields inherited from org.apache.catalina.valves.ValveBase:
container,  containerLog,  info,  next,  sm,  domain,  oname,  mserver,  controller
Constructor:
 public JDBCAccessLogValve() 
Method from org.apache.catalina.valves.JDBCAccessLogValve Summary:
addLifecycleListener,   close,   findLifecycleListeners,   getConnectionName,   getConnectionPassword,   getCurrentTimeMillis,   getUseLongContentLength,   invoke,   open,   removeLifecycleListener,   setBytesField,   setConnectionName,   setConnectionPassword,   setConnectionURL,   setDriverName,   setMethodField,   setPattern,   setQueryField,   setRefererField,   setRemoteHostField,   setResolveHosts,   setStatusField,   setTableName,   setTimestampField,   setUseLongContentLength,   setUserAgentField,   setUserField,   setVirtualHostField,   start,   stop
Methods from org.apache.catalina.valves.ValveBase:
backgroundProcess,   createObjectName,   event,   getContainer,   getContainerName,   getController,   getDomain,   getInfo,   getNext,   getObjectName,   getParentName,   invoke,   postDeregister,   postRegister,   preDeregister,   preRegister,   setContainer,   setController,   setNext,   setObjectName,   toString
Methods from java.lang.Object:
equals,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from org.apache.catalina.valves.JDBCAccessLogValve Detail:
 public  void addLifecycleListener(LifecycleListener listener) 
    Adds a Lifecycle listener.
 protected  void close() 
    Close the specified database connection.
 public LifecycleListener[] findLifecycleListeners() 
    Get the lifecycle listeners associated with this lifecycle. If this Lifecycle has no listeners registered, a zero-length array is returned.
 public String getConnectionName() 
    Return the username to use to connect to the database.
 public String getConnectionPassword() 
    Return the password to use to connect to the database.
 public long getCurrentTimeMillis() 
 public boolean getUseLongContentLength() 
    get useLongContentLength
 public  void invoke(Request request,
    Response response) throws IOException, ServletException 
    This method is invoked by Tomcat on each query.
 protected  void open() throws SQLException 
    Open (if necessary) and return a database connection for use by this AccessLogValve.
 public  void removeLifecycleListener(LifecycleListener listener) 
    Removes a Lifecycle listener.
 public  void setBytesField(String bytesField) 
    Sets the name of the field containing the number of bytes returned.
 public  void setConnectionName(String connectionName) 
    Set the username to use to connect to the database.
 public  void setConnectionPassword(String connectionPassword) 
    Set the password to use to connect to the database.
 public  void setConnectionURL(String connectionURL) 
    Sets the JDBC URL for the database where the log is stored.
 public  void setDriverName(String driverName) 
    Sets the database driver name.
 public  void setMethodField(String methodField) 
    Sets the name of the field containing the HTTP request method.
 public  void setPattern(String pattern) 
    Sets the logging pattern. The patterns supported correspond to the file-based "common" and "combined". These are translated into the use of tables containing either set of fields.

    TO DO: more flexible field choices.

 public  void setQueryField(String queryField) 
    Sets the name of the field containing the URL part of the HTTP query.
 public  void setRefererField(String refererField) 
    Sets the name of the field containing the referer.
 public  void setRemoteHostField(String remoteHostField) 
    Sets the name of the field containing the remote host.
 public  void setResolveHosts(String resolveHosts) 
    Determines whether IP host name resolution is done.
 public  void setStatusField(String statusField) 
    Sets the name of the field containing the HTTP response status code.
 public  void setTableName(String tableName) 
    Sets the name of the table where the logs are stored.
 public  void setTimestampField(String timestampField) 
    Sets the name of the field containing the server-determined timestamp.
 public  void setUseLongContentLength(boolean useLongContentLength) 
 public  void setUserAgentField(String userAgentField) 
    Sets the name of the field containing the user agent.
 public  void setUserField(String userField) 
    Sets the name of the field containing the remote user name.
 public  void setVirtualHostField(String virtualHostField) 
    Sets the name of the field containing the virtual host information (this is in fact the server name).
 public  void start() throws LifecycleException 
    Invoked by Tomcat on startup. The database connection is set here.
 public  void stop() throws LifecycleException 
    Invoked by tomcat on shutdown. The database connection is closed here.