You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2018/03/19 18:35:03 UTC
svn commit: r1827223 - in /tomcat/trunk:
java/org/apache/catalina/valves/AccessLogValve.java
java/org/apache/catalina/valves/LocalStrings.properties
webapps/docs/changelog.xml webapps/docs/config/valve.xml
Author: markt
Date: Mon Mar 19 18:35:03 2018
New Revision: 1827223
URL: http://svn.apache.org/viewvc?rev=1827223&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=52688
Add support for the maxDays attribute to specify the maximum number of days for which rotated access log files should be retained before deletion.
Modified:
tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java
tomcat/trunk/java/org/apache/catalina/valves/LocalStrings.properties
tomcat/trunk/webapps/docs/changelog.xml
tomcat/trunk/webapps/docs/config/valve.xml
Modified: tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java?rev=1827223&r1=1827222&r2=1827223&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java Mon Mar 19 18:35:03 2018
@@ -87,7 +87,7 @@ public class AccessLogValve extends Abst
/**
* The prefix that is added to log file filenames.
*/
- protected String prefix = "access_log";
+ protected volatile String prefix = "access_log";
/**
@@ -111,7 +111,7 @@ public class AccessLogValve extends Abst
/**
* The suffix that is added to log file filenames.
*/
- protected String suffix = "";
+ protected volatile String suffix = "";
/**
@@ -156,9 +156,26 @@ public class AccessLogValve extends Abst
*/
protected volatile String encoding = null;
+ /**
+ * The number of days to retain the access log files before they are
+ * removed.
+ */
+ private int maxDays = -1;
+ private volatile boolean checkForOldLogs = false;
+
// ------------------------------------------------------------- Properties
+ public int getMaxDays() {
+ return maxDays;
+ }
+
+
+ public void setMaxDays(int maxDays) {
+ this.maxDays = maxDays;
+ }
+
+
/**
* @return the directory in which we create log files.
*/
@@ -358,6 +375,50 @@ public class AccessLogValve extends Abst
buffered) {
writer.flush();
}
+
+ int maxDays = this.maxDays;
+ String prefix = this.prefix;
+ String suffix = this.suffix;
+
+ if (rotatable && checkForOldLogs && maxDays > 0) {
+ long deleteIfLastModifiedBefore =
+ System.currentTimeMillis() - (maxDays * 24L * 60 * 60 * 1000);
+ File dir = getDirectoryFile();
+ if (dir.isDirectory()) {
+ String[] oldAccessLogs = dir.list();
+
+ if (oldAccessLogs != null) {
+ for (String oldAccessLog : oldAccessLogs) {
+ boolean match = false;
+
+ if (prefix != null && prefix.length() > 0) {
+ if (!oldAccessLog.startsWith(prefix)) {
+ continue;
+ }
+ match = true;
+ }
+
+ if (suffix != null && suffix.length() > 0) {
+ if (!oldAccessLog.endsWith(suffix)) {
+ continue;
+ }
+ match = true;
+ }
+
+ if (match) {
+ File file = new File(dir, oldAccessLog);
+ if (file.isFile() && file.lastModified() < deleteIfLastModifiedBefore) {
+ if (!file.delete()) {
+ log.warn(sm.getString(
+ "accessLogValve.deleteFail", file.getAbsolutePath()));
+ }
+ }
+ }
+ }
+ }
+ }
+ checkForOldLogs = false;
+ }
}
/**
@@ -423,6 +484,15 @@ public class AccessLogValve extends Abst
// -------------------------------------------------------- Private Methods
+ private File getDirectoryFile() {
+ File dir = new File(directory);
+ if (!dir.isAbsolute()) {
+ dir = new File(getContainer().getCatalinaBase(), directory);
+ }
+ return dir;
+ }
+
+
/**
* Create a File object based on the current log file name.
* Directories are created as needed but the underlying file
@@ -432,12 +502,8 @@ public class AccessLogValve extends Abst
* @return the log file object
*/
private File getLogFile(boolean useDateStamp) {
-
// Create the directory if necessary
- File dir = new File(directory);
- if (!dir.isAbsolute()) {
- dir = new File(getContainer().getCatalinaBase(), directory);
- }
+ File dir = getDirectoryFile();
if (!dir.mkdirs() && !dir.isDirectory()) {
log.error(sm.getString("accessLogValve.openDirFail", dir));
}
@@ -592,6 +658,10 @@ public class AccessLogValve extends Abst
currentLogFile = null;
log.error(sm.getString("accessLogValve.openFail", pathname), e);
}
+ // Rotating a log file will always trigger a new file to be opened so
+ // when a new file is opened, check to see if any old files need to be
+ // removed.
+ checkForOldLogs = true;
}
/**
Modified: tomcat/trunk/java/org/apache/catalina/valves/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/LocalStrings.properties?rev=1827223&r1=1827222&r2=1827223&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/LocalStrings.properties Mon Mar 19 18:35:03 2018
@@ -19,6 +19,7 @@ jdbcAccessLogValve.exception=Exception p
# Access log valve
accessLogValve.openFail=Failed to open access log file [{0}]
accessLogValve.closeFail=Failed to close access log file
+accessLogValve.deleteFail=Failed to delete old access log [{0}]
accessLogValve.openDirFail=Failed to create directory [{0}] for access logs
accessLogValve.rotateFail=Failed to rotate access log
accessLogValve.renameFail=Failed to rename access log from [{0}] to [{1}]
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1827223&r1=1827222&r2=1827223&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Mar 19 18:35:03 2018
@@ -54,6 +54,12 @@
(markt)
</fix>
<fix>
+ <bug>52688</bug>: Add support for the <code>maxDays</code> attribute to
+ the <code>AccessLogValve</code> and <code>ExtendedAccessLogValve</code>.
+ This allows the maximum number of days for which rotated access logs
+ should be retained before deletion to be defined. (markt)
+ </fix>
+ <fix>
Ensure the MBean names for the <code>SSLHostConfig</code> and
<code>SSLHostConfigCertificate</code> are correctly formed when the
<code>Connector</code> is bound to a specific IP address. (markt)
Modified: tomcat/trunk/webapps/docs/config/valve.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/valve.xml?rev=1827223&r1=1827222&r2=1827223&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/valve.xml (original)
+++ tomcat/trunk/webapps/docs/config/valve.xml Mon Mar 19 18:35:03 2018
@@ -194,6 +194,12 @@
</p>
</attribute>
+ <attribute name="maxDays" required="false">
+ <p>The maximum number of days rotated access logs will be retained for
+ before being deleted. If not specified, the default value of
+ <code>-1</code> will be used which means never delete old files.</p>
+ </attribute>
+
<attribute name="maxLogMessageBufferSize" required="false">
<p>Log message buffers are usually recycled and re-used. To prevent
excessive memory usage, if a buffer grows beyond this size it will be
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org