📄 jdbcaccesslogvalve.java
字号:
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* [Additional notices, if required by prior licensing conditions]
*
*/
package org.apache.catalina.valves;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.HttpResponse;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Request;
import org.apache.catalina.Response;
import org.apache.catalina.ValveContext;
import org.apache.catalina.util.LifecycleSupport;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.Logger;
/**
* <p>
* 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:
* <pre>
* <Valve className="AccessLogDBValve"
* driverName="<i>your_jdbc_driver</i>"
* connectionURL="<i>your_jdbc_url</i>"
* pattern="combined" resolveHosts="false"
* />
* </pre>
* </p>
* <p>
* Many parameters can be configured, such as the database connection (with
* <code>driverName</code> and <code>connectionURL</code>),
* the table name (<code>tableName</code>)
* and the field names (corresponding to the get/set method names).
* The same options as AccessLogValve are supported, such as
* <code>resolveHosts</code> and <code>pattern</code> ("common" or "combined"
* only).
* </p>
* <p>
* 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).
* </p>
* <p>
* The database table can be created with the following command:
* </p>
* <pre>
* CREATE TABLE access (
* id INT UNSIGNED AUTO_INCREMENT NOT NULL,
* ts TIMESTAMP NOT NULL,
* remoteHost CHAR(15) NOT NULL,
* user 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 (ts),
* INDEX (remoteHost),
* INDEX (virtualHost),
* INDEX (query),
* INDEX (userAgent)
* );
* </pre>
* <p>
* If the table is created as above, its name and the field names don't need
* to be defined.
* </p>
* <p>
* If the request method is "common", only these fields are used:
* <code>remoteHost, user, timeStamp, query, status, bytes</code>
* </p>
* <p>
* <i>TO DO: provide option for excluding logging of certain MIME types.</i>
* </p>
*
* @author Andre de Jesus
* @author Peter Rossbach
*/
public final class JDBCAccessLogValve
extends ValveBase
implements Lifecycle {
// ----------------------------------------------------------- Constructors
/**
* Class constructor. Initializes the fields with the default values.
* The defaults are:
* <pre>
* driverName = null;
* connectionURL = null;
* tableName = "access";
* remoteHostField = "remoteHost";
* userField = "user";
* timestampField = "timestamp";
* virtualHostField = "virtualHost";
* methodField = "method";
* queryField = "query";
* statusField = "status";
* bytesField = "bytes";
* refererField = "referer";
* userAgentField = "userAgent";
* pattern = "common";
* resolveHosts = false;
* </pre>
*/
public JDBCAccessLogValve() {
super();
driverName = null;
connectionURL = null;
tableName = "access";
remoteHostField = "remoteHost";
userField = "user";
timestampField = "timestamp";
virtualHostField = "virtualHost";
methodField = "method";
queryField = "query";
statusField = "status";
bytesField = "bytes";
refererField = "referer";
userAgentField = "userAgent";
pattern = "common";
resolveHosts = false;
conn = null;
ps = null;
currentTimeMillis = new java.util.Date().getTime();
}
// ----------------------------------------------------- Instance Variables
/**
* The connection username to use when trying to connect to the database.
*/
protected String connectionName = null;
/**
* The connection URL to use when trying to connect to the database.
*/
protected String connectionPassword = null;
/**
* Instance of the JDBC Driver class we use as a connection factory.
*/
protected Driver driver = null;
private String driverName;
private String connectionURL;
private String tableName;
private String remoteHostField;
private String userField;
private String timestampField;
private String virtualHostField;
private String methodField;
private String queryField;
private String statusField;
private String bytesField;
private String refererField;
private String userAgentField;
private String pattern;
private boolean resolveHosts;
private Connection conn;
private PreparedStatement ps;
private long currentTimeMillis;
/**
* The descriptive information about this implementation.
*/
protected static String info =
"org.apache.catalina.valves.JDBCAccessLogValve/1.0";
/**
* The lifecycle event support for this component.
*/
protected LifecycleSupport lifecycle = new LifecycleSupport(this);
/**
* The string manager for this package.
*/
private StringManager sm = StringManager.getManager(Constants.Package);
/**
* Has this component been started yet?
*/
private boolean started = false;
// ------------------------------------------------------------- Properties
/**
* Return the username to use to connect to the database.
*
*/
public String getConnectionName() {
return connectionName;
}
/**
* Set the username to use to connect to the database.
*
* @param connectionName Username
*/
public void setConnectionName(String connectionName) {
this.connectionName = connectionName;
}
/**
* Sets the database driver name.
*
* @param driverName The complete name of the database driver class.
*/
public void setDriverName(String driverName) {
this.driverName = driverName;
}
/**
* Return the password to use to connect to the database.
*
*/
public String getConnectionPassword() {
return connectionPassword;
}
/**
* Set the password to use to connect to the database.
*
* @param connectionPassword User password
*/
public void setConnectionPassword(String connectionPassword) {
this.connectionPassword = connectionPassword;
}
/**
* Sets the JDBC URL for the database where the log is stored.
*
* @param connectionURL The JDBC URL of the database.
*/
public void setConnectionURL(String connectionURL) {
this.connectionURL = connectionURL;
}
/**
* Sets the name of the table where the logs are stored.
*
* @param tableName The name of the table.
*/
public void setTableName(String tableName) {
this.tableName = tableName;
}
/**
* Sets the name of the field containing the remote host.
*
* @param remoteHostField The name of the remote host field.
*/
public void setRemoteHostField(String remoteHostField) {
this.remoteHostField = remoteHostField;
}
/**
* Sets the name of the field containing the remote user name.
*
* @param userField The name of the remote user field.
*/
public void setUserField(String userField) {
this.userField = userField;
}
/**
* Sets the name of the field containing the server-determined timestamp.
*
* @param timestampField The name of the server-determined timestamp field.
*/
public void setTimestampField(String timestampField) {
this.timestampField = timestampField;
}
/**
* Sets the name of the field containing the virtual host information
* (this is in fact the server name).
*
* @param virtualHostField The name of the virtual host field.
*/
public void setVirtualHostField(String virtualHostField) {
this.virtualHostField = virtualHostField;
}
/**
* Sets the name of the field containing the HTTP request method.
*
* @param methodField The name of the HTTP request method field.
*/
public void setMethodField(String methodField) {
this.methodField = methodField;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -