funkman 2003/06/04 09:58:21 Modified: catalina/src/share/org/apache/catalina/valves mbeans-descriptors.xml ExtendedAccessLogValve.java AccessLogValve.java Log: Fix bz - 20380 AccessLogValve incorrectly calculates timezone Enc bz - 16374 Date in file name configurable Enc bz - 16400 Allow logging to be conditional Revision Changes Path 1.3 +13 -1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/mbeans-descriptors.xml Index: mbeans-descriptors.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/mbeans-descriptors.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- mbeans-descriptors.xml 1 Jun 2003 20:57:00 -0000 1.2 +++ mbeans-descriptors.xml 4 Jun 2003 16:58:21 -0000 1.3 @@ -38,13 +38,21 @@ type="boolean"/> <attribute name="rotatable" - description="Rotate log" + description="Flag to indicate automatic log rotation." is="true" type="boolean"/> <attribute name="suffix" description="The suffix that is added to log file filenames" type="java.lang.String"/> + + <attribute name="condition" + description="The value to look for conditional logging." + type="java.lang.String"/> + + <attribute name="fileDateFormat" + description="The format for the date date based log rotation." + type="java.lang.String"/> </mbean> <mbean name="CertificatesValve" @@ -158,6 +166,10 @@ <attribute name="suffix" description="The suffix that is added to log file filenames" + type="java.lang.String"/> + + <attribute name="fileDateFormat" + description="The format for the date date based log rotation." type="java.lang.String"/> <operation name="rotate" 1.3 +28 -5 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/ExtendedAccessLogValve.java Index: ExtendedAccessLogValve.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/valves/ExtendedAccessLogValve.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ExtendedAccessLogValve.java 3 Jun 2003 23:37:05 -0000 1.2 +++ ExtendedAccessLogValve.java 4 Jun 2003 16:58:21 -0000 1.3 @@ -359,6 +359,10 @@ private boolean checkExists = false; + /** + * Date format to place in log file name. Use at your own risk! + */ + private String fileDateFormat = null; // ------------------------------------------------------------- Properties @@ -535,6 +539,23 @@ } + + /** + * 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 @@ -1072,7 +1093,9 @@ timeFormatter = new SimpleDateFormat("HH:mm:ss"); timeFormatter.setTimeZone(tz); currentDate = new Date(System.currentTimeMillis()); - fileDateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + if (fileDateFormat==null || fileDateFormat.length()==0) + fileDateFormat = "yyyy-MM-dd"; + fileDateFormatter = new SimpleDateFormat(fileDateFormat); dateStamp = fileDateFormatter.format(currentDate); timeTakenFormatter = new DecimalFormat("0.000"); 1.4 +117 -21 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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AccessLogValve.java 11 Jan 2003 05:12:48 -0000 1.3 +++ AccessLogValve.java 4 Jun 2003 16:58:21 -0000 1.4 @@ -67,6 +67,7 @@ import java.io.PrintWriter; import java.net.InetAddress; import java.text.SimpleDateFormat; +import java.text.DecimalFormat; import java.util.Date; import java.util.TimeZone; import javax.servlet.ServletException; @@ -113,18 +114,19 @@ * an empty string * <li><b>%r</b> - First line of the request * <li><b>%s</b> - HTTP status code of the response - * <li><b>%S</b> - User session ID + * <li><b>%S</b> - User session ID * <li><b>%t</b> - Date and time, in Common Log Format format * <li><b>%u</b> - Remote user that was authenticated * <li><b>%U</b> - Requested URL path * <li><b>%v</b> - Local server name * <li><b>%D</b> - Time taken to process the request, in millis - * </ul> + * <li><b>%T</b> - Time taken to process the request, in seconds + * </ul> * <p>In addition, the caller can specify one of the following aliases for * commonly utilized patterns:</p> * <ul> * <li><b>common</b> - <code>%h %l %u %t "%r" %s %b</code> - * <li><b>combined</b> - + * <li><b>combined</b> - * <code>%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"</code> * </ul> * @@ -140,6 +142,13 @@ * </ul> * </p> * + * <p> + * Conditional logging is also supported. This can be done with the + * <code>condition</code> property. + * If the value returned from ServletRequest.getAttribute(condition) + * yields a non-null value. The logging will be skipped. + * </p> + * * @author Craig R. McClanahan * @author Jason Brittain * @version $Revision$ $Date$ @@ -227,12 +236,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; + private boolean rotatable = true; /** @@ -282,6 +291,12 @@ /** + * Time taken formatter for 3 decimal places. + */ + private DecimalFormat timeTakenFormatter = null; + + + /** * A date formatter to format a Date into a year string in the format * "yyyy". */ @@ -326,6 +341,17 @@ private long rotationLastChecked = 0L; + /** + * Are we doing conditional logging. default false. + */ + private String condition = null; + + + /** + * Date format to place in log file name. Use at your own risk! + */ + private String fileDateFormat = null; + // ------------------------------------------------------------- Properties @@ -425,21 +451,21 @@ * 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; - + } @@ -487,6 +513,45 @@ } + /** + * 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; + + } + + /** + * 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 @@ -514,6 +579,12 @@ long t2=System.currentTimeMillis(); long time=t2-t1; + if (condition!=null && + null!=request.getRequest().getAttribute(condition)) { + return; + } + + Date date = getDate(); StringBuffer result = new StringBuffer(); @@ -688,7 +759,7 @@ close(); dateStamp = tsDate; open(); - } + } } } @@ -743,7 +814,7 @@ } else { pathname = dir.getAbsolutePath() + File.separator + prefix + suffix; - } + } writer = new PrintWriter(new FileWriter(pathname, true), true); } catch (IOException e) { writer = null; @@ -782,7 +853,7 @@ value = InetAddress.getLocalHost().getHostAddress(); } catch(Throwable e){ value = "127.0.0.1"; - } + } } else if (pattern == 'b') { int length = response.getContentCount(); if (length <= 0) @@ -856,6 +927,8 @@ 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(); @@ -971,6 +1044,28 @@ } + private String calculateTimeZoneOffset(long offset) { + StringBuffer tz = new StringBuffer(); + if ((offset<0)) { + tz.append("-"); + offset = -offset; + } + + 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 @@ -987,7 +1082,7 @@ /** - * Get the lifecycle listeners associated with this lifecycle. If this + * Get the lifecycle listeners associated with this lifecycle. If this * Lifecycle has no listeners registered, a zero-length array is returned. */ public LifecycleListener[] findLifecycleListeners() { @@ -1028,11 +1123,11 @@ // Initialize the timeZone, Date formatters, and currentDate TimeZone tz = TimeZone.getDefault(); - timeZone = "" + (tz.getRawOffset() / (60 * 60 * 10)); - if (timeZone.length() < 5) - timeZone = timeZone.substring(0, 1) + "0" + - timeZone.substring(1, timeZone.length()); - dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); + 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); @@ -1044,6 +1139,7 @@ timeFormatter.setTimeZone(tz); currentDate = new Date(); dateStamp = dateFormatter.format(currentDate); + timeTakenFormatter = new DecimalFormat("0.000"); open();
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]