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 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.
| Modifier and Type | Field and Description |
|---|---|
| private String | |
| private Connection | |
| pack-priv String | connectionName
The connection username to use when trying to connect to the database. |
| pack-priv String | connectionPassword
The connection URL to use when trying to connect to the database. |
| private String | |
| private long | |
| pack-priv Driver | driver
Instance of the JDBC Driver class we use as a connection factory. |
| private String | |
| private String | |
| private String | |
| private PreparedStatement | |
| private String | |
| private String | |
| private String | |
| pack-priv boolean | requestAttributesEnabled
Should this valve set request attributes for IP address, hostname, protocol and port used for the request. |
| private boolean | |
| private String | |
| private String | |
| private String | |
| pack-priv boolean | useLongContentLength
Use long contentLength as you have more 4 GB output. |
| private String | |
| private String | |
| private String |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| protected void | |
| public String | |
| public String | |
| public long | |
| public boolean | |
| public boolean | Returns: true if content length should be considered a long rather than an int, defaults to
false
|
| public void | invoke(Request
The Request object. request, Response The Response object. response)Implements org. This method is invoked by Tomcat on each query. |
| public void | log(Request
Request (associated with the response) to log request, Response Response (associated with the request) to log response, long Time taken to process the request/response in
nanoseconds (use 0 if not known); in Tomcat
versions prior to 10, the time unit was
milliseconds time)Implements org. Add the request/response to the access log using the specified processing time. |
| protected void | |
| public void | setBytesField(String
The name of the returned bytes field. bytesField)Sets the name of the field containing the number of bytes returned. |
| public void | |
| public void | setConnectionPassword(String
User password connectionPassword)Set the password to use to connect to the database. |
| public void | setConnectionURL(String
The JDBC URL of the database. connectionURL)Sets the JDBC URL for the database where the log is stored. |
| public void | setDriverName(String
The complete name of the database driver class. driverName)Sets the database driver name. |
| public void | setMethodField(String
The name of the HTTP request method field. methodField)Sets the name of the field containing the HTTP request method. |
| public void | |
| public void | setQueryField(String
The name of the field containing the URL part of the HTTP query. queryField)Sets the name of the field containing the URL part of the HTTP query. |
| public void | setRefererField(String
The referer field name. refererField)Sets the name of the field containing the referer. |
| public void | setRemoteHostField(String
The name of the remote host field. remoteHostField)Sets the name of the field containing the remote host. |
| public void | setRequestAttributesEnabled(boolean
true causes the attributes
to be used, false causes
the original values to be used.Implements org. Should this valve use request attributes for IP address, hostname, protocol and port used for the request? |
| public void | setResolveHosts(String
"true" or "false", if host IP resolution is desired or not. resolveHosts)Determines whether IP host name resolution is done. |
| public void | setStatusField(String
The name of the HTTP response status code field. statusField)Sets the name of the field containing the HTTP response status code. |
| public void | setTableName(String
The name of the table. tableName)Sets the name of the table where the logs are stored. |
| public void | setTimestampField(String
The name of the server-determined timestamp field. timestampField)Sets the name of the field containing the server-determined timestamp. |
| public void | |
| public void | setUserAgentField(String
The name of the user agent field. userAgentField)Sets the name of the field containing the user agent. |
| public void | setUserField(String
The name of the remote user field. userField)Sets the name of the field containing the remote user name. |
| public void | setVirtualHostField(String
The name of the virtual host field. virtualHostField)Sets the name of the field containing the virtual host information (this is in fact the server name). |
| protected void | startInternal()
Overrides org. Start this component and implement the requirements of
|
| protected void | stopInternal()
Overrides org. Stop this component and implement the requirements of
|
| bytesField | back to summary |
|---|---|
| private String bytesField | |
| conn | back to summary |
|---|---|
| private Connection conn | |
| connectionName | back to summary |
|---|---|
| pack-priv String connectionName The connection username to use when trying to connect to the database. | |
| connectionPassword | back to summary |
|---|---|
| pack-priv String connectionPassword The connection URL to use when trying to connect to the database. | |
| connectionURL | back to summary |
|---|---|
| private String connectionURL | |
| currentTimeMillis | back to summary |
|---|---|
| private long currentTimeMillis | |
| driver | back to summary |
|---|---|
| pack-priv Driver driver Instance of the JDBC Driver class we use as a connection factory. | |
| driverName | back to summary |
|---|---|
| private String driverName | |
| methodField | back to summary |
|---|---|
| private String methodField | |
| pattern | back to summary |
|---|---|
| private String pattern | |
| ps | back to summary |
|---|---|
| private PreparedStatement ps | |
| queryField | back to summary |
|---|---|
| private String queryField | |
| refererField | back to summary |
|---|---|
| private String refererField | |
| remoteHostField | back to summary |
|---|---|
| private String remoteHostField | |
| requestAttributesEnabled | back to summary |
|---|---|
| pack-priv boolean requestAttributesEnabled Should this valve set request attributes for IP address, hostname, protocol and port used for the request.
Default is
| |
| resolveHosts | back to summary |
|---|---|
| private boolean resolveHosts | |
| statusField | back to summary |
|---|---|
| private String statusField | |
| tableName | back to summary |
|---|---|
| private String tableName | |
| timestampField | back to summary |
|---|---|
| private String timestampField | |
| useLongContentLength | back to summary |
|---|---|
| pack-priv boolean useLongContentLength Use long contentLength as you have more 4 GB output.
| |
| userAgentField | back to summary |
|---|---|
| private String userAgentField | |
| userField | back to summary |
|---|---|
| private String userField | |
| virtualHostField | back to summary |
|---|---|
| private String virtualHostField | |
| JDBCAccessLogValve | back to summary |
|---|---|
| public JDBCAccessLogValve() Class constructor. Initializes the fields with the default values. The defaults are: driverName = null; connectionURL = null; tableName = "access"; remoteHostField = "remoteHost"; userField = "userName"; timestampField = "timestamp"; virtualHostField = "virtualHost"; methodField = "method"; queryField = "query"; statusField = "status"; bytesField = "bytes"; refererField = "referer"; userAgentField = "userAgent"; pattern = "common"; resolveHosts = false; | |
| close | back to summary |
|---|---|
| protected void close() Close the specified database connection. | |
| getConnectionName | back to summary |
|---|---|
public String getConnectionName()
| |
| getConnectionPassword | back to summary |
|---|---|
public String getConnectionPassword()
| |
| getCurrentTimeMillis | back to summary |
|---|---|
| public long getCurrentTimeMillis() | |
| getRequestAttributesEnabled | back to summary |
|---|---|
| public boolean getRequestAttributesEnabled() Implements org.
| |
| getUseLongContentLength | back to summary |
|---|---|
public boolean getUseLongContentLength()
| |
| invoke | back to summary |
|---|---|
| public void invoke(Request request, Response response) throws IOException, ServletException Implements org. This method is invoked by Tomcat on each query.
| |
| log | back to summary |
|---|---|
| public void log(Request request, Response response, long time) Implements org. Doc from org. Add the request/response to the access log using the specified processing time.
| |
| open | back to summary |
|---|---|
| protected void open() throws SQLException Open (if necessary) and return a database connection for use by this AccessLogValve.
| |
| setBytesField | back to summary |
|---|---|
| public void setBytesField(String bytesField) Sets the name of the field containing the number of bytes returned.
| |
| setConnectionName | back to summary |
|---|---|
| public void setConnectionName(String connectionName) Set the username to use to connect to the database.
| |
| setConnectionPassword | back to summary |
|---|---|
| public void setConnectionPassword(String connectionPassword) Set the password to use to connect to the database.
| |
| setConnectionURL | back to summary |
|---|---|
| public void setConnectionURL(String connectionURL) Sets the JDBC URL for the database where the log is stored.
| |
| setDriverName | back to summary |
|---|---|
| public void setDriverName(String driverName) Sets the database driver name.
| |
| setMethodField | back to summary |
|---|---|
| public void setMethodField(String methodField) Sets the name of the field containing the HTTP request method.
| |
| setPattern | back to summary |
|---|---|
| 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.
| |
| setQueryField | back to summary |
|---|---|
| public void setQueryField(String queryField) Sets the name of the field containing the URL part of the HTTP query.
| |
| setRefererField | back to summary |
|---|---|
| public void setRefererField(String refererField) Sets the name of the field containing the referer.
| |
| setRemoteHostField | back to summary |
|---|---|
| public void setRemoteHostField(String remoteHostField) Sets the name of the field containing the remote host.
| |
| setRequestAttributesEnabled | back to summary |
|---|---|
| public void setRequestAttributesEnabled(boolean requestAttributesEnabled) Implements org. Doc from org. Should this valve use request attributes for IP address, hostname, protocol and port used for the request? The attributes used are:
true.
| |
| setResolveHosts | back to summary |
|---|---|
| public void setResolveHosts(String resolveHosts) Determines whether IP host name resolution is done.
| |
| setStatusField | back to summary |
|---|---|
| public void setStatusField(String statusField) Sets the name of the field containing the HTTP response status code.
| |
| setTableName | back to summary |
|---|---|
| public void setTableName(String tableName) Sets the name of the table where the logs are stored.
| |
| setTimestampField | back to summary |
|---|---|
| public void setTimestampField(String timestampField) Sets the name of the field containing the server-determined timestamp.
| |
| setUseLongContentLength | back to summary |
|---|---|
public void setUseLongContentLength(boolean useLongContentLength)
| |
| setUserAgentField | back to summary |
|---|---|
| public void setUserAgentField(String userAgentField) Sets the name of the field containing the user agent.
| |
| setUserField | back to summary |
|---|---|
| public void setUserField(String userField) Sets the name of the field containing the remote user name.
| |
| setVirtualHostField | back to summary |
|---|---|
| public void setVirtualHostField(String virtualHostField) Sets the name of the field containing the virtual host information (this is in fact the server name).
| |
| startInternal | back to summary |
|---|---|
| protected void startInternal() throws LifecycleException Overrides org. Start this component and implement the requirements of
| |
| stopInternal | back to summary |
|---|---|
| protected void stopInternal() throws LifecycleException Overrides org. Stop this component and implement the requirements of
| |