You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by am...@apache.org on 2002/11/22 23:23:44 UTC
cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves AccessLogValve.java
amyroh 2002/11/22 14:23:44
Modified: catalina/src/share/org/apache/catalina/valves
AccessLogValve.java
Log:
Port change to AccessLogValve.
Revision Changes Path
1.2 +174 -26 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/AccessLogValve.java
Index: AccessLogValve.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/AccessLogValve.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AccessLogValve.java 18 Jul 2002 16:47:43 -0000 1.1
+++ AccessLogValve.java 22 Nov 2002 22:23:44 -0000 1.2
@@ -65,14 +65,17 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
+import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
import org.apache.catalina.HttpResponse;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
@@ -124,8 +127,17 @@
* <code>%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"</code>
* </ul>
*
- * <p><b>FIXME</b> - Improve the parsing so that things like
- * <code>%{xxx}i</code> can be implemented.</p>
+ * <p>
+ * There is also support to write information from the cookie, incoming
+ * header, the Session or something else in the ServletRequest.<br>
+ * It is modeled after the apache syntax:
+ * <ul>
+ * <li><code>%{xxx}i</code> for incoming headers
+ * <li><code>%{xxx}c</code> for a specific cookie
+ * <li><code>%{xxx}r</code> xxx is an attribute in the ServletRequest
+ * <li><code>%{xxx}s</code> xxx is an attribute in the HttpSession
+ * </ul>
+ * </p>
*
* @author Craig R. McClanahan
* @author Jason Brittain
@@ -214,6 +226,12 @@
* The prefix that is added to log file filenames.
*/
private String prefix = "access_log.";
+
+
+ /**
+ * Should we rotate our log file? Default is true (like old behavior)
+ */
+ private boolean rotatable = true;
/**
@@ -403,6 +421,28 @@
/**
+ * Should we rotate the logs
+ */
+ 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() {
@@ -557,7 +597,31 @@
for (int i = 0; i < pattern.length(); i++) {
char ch = pattern.charAt(i);
if (replace) {
- result.append(replace(ch, date, request, response));
+ /* For code that processes {, the behavior will be ... if I
+ * do not enounter a closing } - then I ignore the {
+ */
+ if ('{' == ch){
+ StringBuffer name = new StringBuffer();
+ int j = i + 1;
+ for(;j < pattern.length() && '}' != pattern.charAt(j); j++) {
+ name.append(pattern.charAt(j));
+ }
+ if (j+1 < pattern.length()) {
+ /* the +1 was to account for } which we increment now */
+ j++;
+ result.append(replace(name.toString(),
+ pattern.charAt(j),
+ request,
+ response));
+ i=j; /*Since we walked more than one character*/
+ } else {
+ //D'oh - end of string - pretend we never did this
+ //and do processing the "old way"
+ result.append(replace(ch, date, request, response));
+ }
+ } else {
+ result.append(replace(ch, date, request, response));
+ }
replace = false;
} else if (ch == '%') {
replace = true;
@@ -599,28 +663,30 @@
*/
public void log(String message, Date date) {
- // Only do a logfile switch check once a second, max.
- long systime = System.currentTimeMillis();
- if ((systime - rotationLastChecked) > 1000) {
-
- // We need a new currentDate
- currentDate = new Date(systime);
- rotationLastChecked = systime;
-
- // Check for a change of date
- String tsDate = dateFormatter.format(currentDate);
-
- // If the date has changed, switch log files
- if (!dateStamp.equals(tsDate)) {
- synchronized (this) {
- if (!dateStamp.equals(tsDate)) {
- close();
- dateStamp = tsDate;
- open();
+ if (rotatable){
+ // Only do a logfile switch check once a second, max.
+ long systime = System.currentTimeMillis();
+ if ((systime - rotationLastChecked) > 1000) {
+
+ // We need a new currentDate
+ currentDate = new Date(systime);
+ rotationLastChecked = systime;
+
+ // Check for a change of date
+ String tsDate = dateFormatter.format(currentDate);
+
+ // If the date has changed, switch log files
+ if (!dateStamp.equals(tsDate)) {
+ synchronized (this) {
+ if (!dateStamp.equals(tsDate)) {
+ close();
+ dateStamp = tsDate;
+ open();
+ }
}
}
- }
+ }
}
// Log this message
@@ -663,8 +729,15 @@
// Open the current log file
try {
- String pathname = dir.getAbsolutePath() + File.separator +
- prefix + dateStamp + suffix;
+ 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;
@@ -699,7 +772,11 @@
if (pattern == 'a') {
value = req.getRemoteAddr();
} else if (pattern == 'A') {
- value = "127.0.0.1"; // FIXME
+ try {
+ value = InetAddress.getLocalHost().getHostAddress();
+ } catch(Throwable e){
+ value = "127.0.0.1";
+ }
} else if (pattern == 'b') {
int length = response.getContentCount();
if (length <= 0)
@@ -792,6 +869,77 @@
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 = null;
+ if (req instanceof 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 "-";
+ }
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>