📄 accesslogvalve.java
字号:
private String lookup(String month) {
int index;
try {
index = Integer.parseInt(month) - 1;
} catch (Throwable t) {
index = 0; // Can not happen, in theory
}
return (months[index]);
}
/**
* Open the new log file for the date specified by <code>dateStamp</code>.
*/
private synchronized void open() {
// Create the directory if necessary
File dir = new File(directory);
if (!dir.isAbsolute())
dir = new File(System.getProperty("catalina.base"), directory);
dir.mkdirs();
// Open the current log file
try {
String pathname;
// If no rotate - no need for dateStamp in fileName
if (rotatable){
pathname = dir.getAbsolutePath() + File.separator +
prefix + dateStamp + suffix;
} else {
pathname = dir.getAbsolutePath() + File.separator +
prefix + suffix;
}
writer = new PrintWriter(new FileWriter(pathname, true), true);
} catch (IOException e) {
writer = null;
}
}
/**
* Return the replacement text for the specified pattern character.
*
* @param pattern Pattern character identifying the desired text
* @param date the current Date so that this method doesn't need to
* create one
* @param request Request being processed
* @param response Response being processed
*/
private String replace(char pattern, Date date, Request request,
Response response, long time) {
String value = null;
ServletRequest req = request.getRequest();
HttpServletRequest hreq = (HttpServletRequest) req;
ServletResponse res = response.getResponse();
HttpServletResponse hres = (HttpServletResponse) res;
if (pattern == 'a') {
value = req.getRemoteAddr();
} else if (pattern == 'A') {
try {
value = InetAddress.getLocalHost().getHostAddress();
} catch(Throwable e){
value = "127.0.0.1";
}
} else if (pattern == 'b') {
int length = response.getContentCount();
if (length <= 0)
value = "-";
else
value = "" + length;
} else if (pattern == 'B') {
value = "" + response.getContentLength();
} else if (pattern == 'h') {
value = req.getRemoteHost();
} else if (pattern == 'H') {
value = req.getProtocol();
} else if (pattern == 'l') {
value = "-";
} else if (pattern == 'm') {
if (hreq != null)
value = hreq.getMethod();
else
value = "";
} else if (pattern == 'p') {
value = "" + req.getServerPort();
} else if (pattern == 'D') {
value = "" + time;
} else if (pattern == 'q') {
String query = null;
if (hreq != null)
query = hreq.getQueryString();
if (query != null)
value = "?" + query;
else
value = "";
} else if (pattern == 'r') {
StringBuffer sb = new StringBuffer();
if (hreq != null) {
sb.append(hreq.getMethod());
sb.append(space);
sb.append(hreq.getRequestURI());
if (hreq.getQueryString() != null) {
sb.append('?');
sb.append(hreq.getQueryString());
}
sb.append(space);
sb.append(hreq.getProtocol());
} else {
sb.append("- - ");
sb.append(req.getProtocol());
}
value = sb.toString();
} else if (pattern == 'S') {
if (hreq != null)
if (hreq.getSession(false) != null)
value = hreq.getSession(false).getId();
else value = "-";
else
value = "-";
} else if (pattern == 's') {
if (hres != null)
value = "" + ((HttpResponse) response).getStatus();
else
value = "-";
} else if (pattern == 't') {
StringBuffer temp = new StringBuffer("[");
temp.append(dayFormatter.format(date)); // Day
temp.append('/');
temp.append(lookup(monthFormatter.format(date))); // Month
temp.append('/');
temp.append(yearFormatter.format(date)); // Year
temp.append(':');
temp.append(timeFormatter.format(date)); // Time
temp.append(' ');
temp.append(timeZone); // Timezone
temp.append(']');
value = temp.toString();
} else if (pattern == 'T') {
value = timeTakenFormatter.format(time/1000d);
} else if (pattern == 'u') {
if (hreq != null)
value = hreq.getRemoteUser();
if (value == null)
value = "-";
} else if (pattern == 'U') {
if (hreq != null)
value = hreq.getRequestURI();
else
value = "-";
} else if (pattern == 'v') {
value = req.getServerName();
} else {
value = "???" + pattern + "???";
}
if (value == null)
return ("");
else
return (value);
}
/**
* Return the replacement text for the specified "header/parameter".
*
* @param header The header/parameter to get
* @param type Where to get it from i=input,c=cookie,r=ServletRequest,s=Session
* @param request Request being processed
* @param response Response being processed
*/
private String replace(String header, char type, Request request,
Response response) {
Object value = null;
ServletRequest req = request.getRequest();
HttpServletRequest hreq = (HttpServletRequest) req;
switch (type) {
case 'i':
if (null != hreq)
value = hreq.getHeader(header);
else
value= "??";
break;
/*
// Someone please make me work
case 'o':
break;
*/
case 'c':
Cookie[] c = hreq.getCookies();
for (int i=0; c != null && i < c.length; i++){
if (header.equals(c[i].getName())){
value = c[i].getValue();
break;
}
}
break;
case 'r':
if (null != hreq)
value = hreq.getAttribute(header);
else
value= "??";
break;
case 's':
if (null != hreq) {
HttpSession sess = hreq.getSession(false);
if (null != sess)
value = sess.getAttribute(header);
}
break;
default:
value = "???";
}
/* try catch in case toString() barfs */
try {
if (value!=null)
if (value instanceof String)
return (String)value;
else
return value.toString();
else
return "-";
} catch(Throwable e) {
return "-";
}
}
/**
* This method returns a Date object that is accurate to within one
* second. If a thread calls this method to get a Date and it's been
* less than 1 second since a new Date was created, this method
* simply gives out the same Date again so that the system doesn't
* spend time creating Date objects unnecessarily.
*
* @return Date
*/
private Date getDate() {
if(currentDate == null) {
currentDate = new Date();
} else {
// Only create a new Date once per second, max.
long systime = System.currentTimeMillis();
if ((systime - currentDate.getTime()) > 1000) {
currentDate = new Date(systime);
}
}
return currentDate;
}
private String calculateTimeZoneOffset(long offset) {
StringBuffer tz = new StringBuffer();
if ((offset<0)) {
tz.append("-");
offset = -offset;
} else {
tz.append("+");
}
long hourOffset = offset/(1000*60*60);
long minuteOffset = (offset/(1000*60)) % 60;
if (hourOffset<10)
tz.append("0");
tz.append(hourOffset);
if (minuteOffset<10)
tz.append("0");
tz.append(minuteOffset);
return tz.toString();
}
// ------------------------------------------------------ Lifecycle Methods
/**
* Add a lifecycle event listener to this component.
*
* @param listener The listener to add
*/
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
/**
* Get the lifecycle listeners associated with this lifecycle. If this
* Lifecycle has no listeners registered, a zero-length array is returned.
*/
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
/**
* Remove a lifecycle event listener from this component.
*
* @param listener The listener to add
*/
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
/**
* Prepare for the beginning of active use of the public methods of this
* component. This method should be called after <code>configure()</code>,
* and before any of the public methods of the component are utilized.
*
* @exception LifecycleException if this component detects a fatal error
* that prevents this component from being used
*/
public void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException
(sm.getString("accessLogValve.alreadyStarted"));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Initialize the timeZone, Date formatters, and currentDate
TimeZone tz = TimeZone.getDefault();
timeZone = calculateTimeZoneOffset(tz.getRawOffset());
if (fileDateFormat==null || fileDateFormat.length()==0)
fileDateFormat = "yyyy-MM-dd";
dateFormatter = new SimpleDateFormat(fileDateFormat);
dateFormatter.setTimeZone(tz);
dayFormatter = new SimpleDateFormat("dd");
dayFormatter.setTimeZone(tz);
monthFormatter = new SimpleDateFormat("MM");
monthFormatter.setTimeZone(tz);
yearFormatter = new SimpleDateFormat("yyyy");
yearFormatter.setTimeZone(tz);
timeFormatter = new SimpleDateFormat("HH:mm:ss");
timeFormatter.setTimeZone(tz);
currentDate = new Date();
dateStamp = dateFormatter.format(currentDate);
timeTakenFormatter = new DecimalFormat("0.000");
open();
}
/**
* Gracefully terminate the active use of the public methods of this
* component. This method should be the last one called on a given
* instance of this component.
*
* @exception LifecycleException if this component detects a fatal error
* that needs to be reported
*/
public void stop() throws LifecycleException {
// Validate and update our current component state
if (!started)
throw new LifecycleException
(sm.getString("accessLogValve.notStarted"));
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
close();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -