📄 extendedaccesslogvalve.java
字号:
}
/**
* Set the directory in which we create log files.
*
* @param directory The new log file directory
*/
public void setDirectory(String directory) {
this.directory = directory;
}
/**
* Return descriptive information about this implementation.
*/
public String getInfo() {
return (info);
}
/**
* Return the format pattern.
*/
public String getPattern() {
return (this.pattern);
}
/**
* Set the format pattern, first translating any recognized alias.
*
* @param pattern The new pattern pattern
*/
public void setPattern(String pattern) {
FieldInfo[] f= decodePattern(pattern);
if (f!=null) {
this.pattern = pattern;
this.fieldInfos = f;
}
}
/**
* Return the log file prefix.
*/
public String getPrefix() {
return (prefix);
}
/**
* Set the log file prefix.
*
* @param prefix The new log file prefix
*/
public void setPrefix(String prefix) {
this.prefix = prefix;
}
/**
* Return true if logs are automatically rotated.
*/
public boolean isRotatable() {
return rotatable;
}
/**
* Set the value is we should we rotate the logs
*
* @param rotatable true is we should rotate.
*/
public void setRotatable(boolean rotatable) {
this.rotatable = rotatable;
}
/**
* Return the log file suffix.
*/
public String getSuffix() {
return (suffix);
}
/**
* Set the log file suffix.
*
* @param suffix The new log file suffix
*/
public void setSuffix(String suffix) {
this.suffix = suffix;
}
/**
* Return whether the attribute name to look for when
* performing conditional loggging. If null, every
* request is logged.
*/
public String getCondition() {
return condition;
}
/**
* Set the ServletRequest.attribute to look for to perform
* conditional logging. Set to null to log everything.
*
* @param condition Set to null to log everything
*/
public void setCondition(String condition) {
this.condition = condition;
}
/**
* Check for file existence before logging.
*/
public boolean isCheckExists() {
return checkExists;
}
/**
* Set whether to check for log file existence before logging.
*
* @param checkExists true meaning to check for file existence.
*/
public void setCheckExists(boolean checkExists) {
this.checkExists = checkExists;
}
/**
* Return the date format date based log rotation.
*/
public String getFileDateFormat() {
return fileDateFormat;
}
/**
* Set the date format date based log rotation.
*/
public void setFileDateFormat(String fileDateFormat) {
this.fileDateFormat = fileDateFormat;
}
// --------------------------------------------------------- Public Methods
/**
* Log a message summarizing the specified request and response, according
* to the format specified by the <code>pattern</code> property.
*
* @param request Request being processed
* @param response Response being processed
* @param context The valve context used to invoke the next valve
* in the current processing pipeline
*
* @exception IOException if an input/output error has occurred
* @exception ServletException if a servlet error has occurred
*/
public void invoke(Request request, Response response,
ValveContext context)
throws IOException, ServletException {
// Pass this request on to the next valve in our pipeline
long endTime;
long runTime;
long startTime=System.currentTimeMillis();
context.invokeNext(request, response);
endTime = System.currentTimeMillis();
runTime = endTime-startTime;
if (fieldInfos==null || condition!=null &&
null!=request.getRequest().getAttribute(condition)) {
return;
}
Date date = getDate(endTime);
StringBuffer result = new StringBuffer();
for (int i=0; fieldInfos!=null && i<fieldInfos.length; i++) {
switch(fieldInfos[i].type) {
case FieldInfo.DATA_CLIENT:
if (FieldInfo.FIELD_IP==fieldInfos[i].location)
result.append(request.getRequest().getRemoteAddr());
else if (FieldInfo.FIELD_DNS==fieldInfos[i].location)
result.append(request.getRequest().getRemoteHost());
else
result.append("?WTF?"); /* This should never happen! */
break;
case FieldInfo.DATA_SERVER:
if (FieldInfo.FIELD_IP==fieldInfos[i].location)
result.append(myIpAddress);
else if (FieldInfo.FIELD_DNS==fieldInfos[i].location)
result.append(myDNSName);
else
result.append("?WTF?"); /* This should never happen! */
break;
case FieldInfo.DATA_REMOTE:
result.append('?'); /* I don't know how to handle these! */
break;
case FieldInfo.DATA_CLIENT_TO_SERVER:
result.append(getClientToServer(fieldInfos[i], request));
break;
case FieldInfo.DATA_SERVER_TO_CLIENT:
result.append(getServerToClient(fieldInfos[i], response));
break;
case FieldInfo.DATA_SERVER_TO_RSERVER:
result.append('-');
break;
case FieldInfo.DATA_RSERVER_TO_SERVER:
result.append('-');
break;
case FieldInfo.DATA_APP_SPECIFIC:
result.append(getAppSpecific(fieldInfos[i], request));
break;
case FieldInfo.DATA_SPECIAL:
if (FieldInfo.SPECIAL_DATE==fieldInfos[i].location)
result.append(dateFormatter.format(date));
else if (FieldInfo.SPECIAL_TIME_TAKEN==fieldInfos[i].location)
result.append(timeTakenFormatter.format(runTime/1000d));
else if (FieldInfo.SPECIAL_TIME==fieldInfos[i].location)
result.append(timeFormatter.format(date));
else if (FieldInfo.SPECIAL_BYTES==fieldInfos[i].location) {
int length = response.getContentCount();
if (length > 0)
result.append(length);
else
result.append("-");
} else if (FieldInfo.SPECIAL_CACHED==fieldInfos[i].location)
result.append('-'); /* I don't know how to evaluate this! */
else
result.append("?WTF?"); /* This should never happen! */
break;
default:
result.append("?WTF?"); /* This should never happen! */
}
if (fieldInfos[i].postWhiteSpace!=null) {
result.append(fieldInfos[i].postWhiteSpace);
}
}
log(result.toString(), date);
}
/**
* Rename the existing log file to something else. Then open the
* old log file name up once again. Intended to be called by a JMX
* agent.
*
*
* @param newFileName The file name to move the log file entry to
* @return true if a file was rotated with no error
*/
public synchronized boolean rotate(String newFileName) {
if (currentLogFile!=null) {
File holder = currentLogFile;
close();
try {
holder.renameTo(new File(newFileName));
} catch(Throwable e){
log.error("rotate failed", e);
}
/* Make sure date is correct */
currentDate = new Date(System.currentTimeMillis());
dateStamp = fileDateFormatter.format(currentDate);
open();
return true;
} else {
return false;
}
}
// -------------------------------------------------------- Private Methods
/**
* Return the client to server data.
* @param fieldInfo The field to decode.
* @param request The object we pull data from.
* @return The appropriate value.
*/
private String getClientToServer(FieldInfo fieldInfo, Request request) {
ServletRequest sr = request.getRequest();
HttpServletRequest hsr = null;
if (sr instanceof HttpServletRequest)
hsr = (HttpServletRequest)sr;
switch(fieldInfo.location) {
case FieldInfo.FIELD_METHOD:
return hsr.getMethod();
case FieldInfo.FIELD_URI:
if (null==hsr.getQueryString())
return hsr.getRequestURI();
else
return hsr.getRequestURI() + "?" + hsr.getQueryString();
case FieldInfo.FIELD_URI_STEM:
return hsr.getRequestURI();
case FieldInfo.FIELD_URI_QUERY:
if (null==hsr.getQueryString())
return "-";
return hsr.getQueryString();
case FieldInfo.FIELD_HEADER:
return wrap(hsr.getHeader(fieldInfo.value));
default:
;
}
return "-";
}
/**
* Return the server to client data.
* @param fieldInfo The field to decode.
* @param response The object we pull data from.
* @return The appropriate value.
*/
private String getServerToClient(FieldInfo fieldInfo, Response response) {
HttpResponse r = (HttpResponse)response;
switch(fieldInfo.location) {
case FieldInfo.FIELD_STATUS:
return "" + r.getStatus();
case FieldInfo.FIELD_COMMENT:
return "?"; /* Not coded yet*/
case FieldInfo.FIELD_HEADER:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -