summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--STATUS5
-rw-r--r--docs/manual/programs/rotatelogs.xml6
-rw-r--r--support/rotatelogs.c39
4 files changed, 42 insertions, 10 deletions
diff --git a/CHANGES b/CHANGES
index 0f840d368d..91e1872d18 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,6 @@
-*- coding: utf-8 -*-
+ *) rotatelogs: add -n number-of-files option to roate through a number
+ of fixed-name logfiles. [Eric Covener]
Changes with Apache 2.4.5
diff --git a/STATUS b/STATUS
index db979ad691..4eec6f9816 100644
--- a/STATUS
+++ b/STATUS
@@ -90,11 +90,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- * rotatelogs: support -n number-of-files for circular set of filenames
- trunk patch: http://svn.apache.org/r1490493
- http://svn.apache.org/r1490761
- 2.4.x patch: trunk works + compat for manual
- +1 covener, minfrin, jim
PATCHES PROPOSED TO BACKPORT FROM TRUNK:
diff --git a/docs/manual/programs/rotatelogs.xml b/docs/manual/programs/rotatelogs.xml
index bae96f8435..f6c6aec508 100644
--- a/docs/manual/programs/rotatelogs.xml
+++ b/docs/manual/programs/rotatelogs.xml
@@ -41,6 +41,7 @@
[ -<strong>v</strong> ]
[ -<strong>e</strong> ]
[ -<strong>c</strong> ]
+ [ -<strong>n</strong> <var>number-of-files</var> ]
<var>logfile</var>
<var>rotationtime</var>|<var>filesize</var>(B|K|M|G)
[ <var>offset</var> ]</code></p>
@@ -102,6 +103,11 @@ processed in real time by a further tool in the chain.</dd>
<dt><code>-c</code></dt>
<dd>Create log file for each interval, even if empty.</dd>
+<dt><code>-n <var>number-of-files</var></code></dt>
+<dd>Use a circular list of filenames without timestamps.
+With -n 3, the series of log files opened would be
+"logfile", "logfile.1", "logfile.2", then overwriting "logfile".</dd>
+
<dt><code><var>logfile</var></code></dt>
<dd><p>The path plus basename of the logfile. If <var>logfile</var>
diff --git a/support/rotatelogs.c b/support/rotatelogs.c
index 9bc3328599..3f32f3cac4 100644
--- a/support/rotatelogs.c
+++ b/support/rotatelogs.c
@@ -99,6 +99,7 @@ struct rotate_config {
#if APR_FILES_AS_SOCKETS
int create_empty;
#endif
+ int num_files;
};
typedef struct rotate_status rotate_status_t;
@@ -118,6 +119,7 @@ struct rotate_status {
int rotateReason;
int tLogEnd;
int nMessCount;
+ int fileNum;
};
static rotate_config_t config;
@@ -130,9 +132,9 @@ static void usage(const char *argv0, const char *reason)
}
fprintf(stderr,
#if APR_FILES_AS_SOCKETS
- "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-c] <logfile> "
+ "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-c] [-n number] <logfile> "
#else
- "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] <logfile> "
+ "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-n number] <logfile> "
#endif
"{<rotation time in seconds>|<rotation size>(B|K|M|G)} "
"[offset minutes from UTC]\n\n",
@@ -374,6 +376,7 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status)
int tLogStart;
apr_status_t rv;
struct logfile newlog;
+ int thisLogNum = -1;
status->rotateReason = ROTATE_NONE;
@@ -407,6 +410,16 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status)
if (config->truncate) {
apr_snprintf(newlog.name, sizeof(newlog.name), "%s", config->szLogRoot);
}
+ else if (config->num_files > 0) {
+ if (status->fileNum == -1 || status->fileNum == (config->num_files - 1)) {
+ thisLogNum = 0;
+ apr_snprintf(newlog.name, sizeof(newlog.name), "%s", config->szLogRoot);
+ }
+ else {
+ thisLogNum = status->fileNum + 1;
+ apr_snprintf(newlog.name, sizeof(newlog.name), "%s.%d", config->szLogRoot, thisLogNum);
+ }
+ }
else {
apr_snprintf(newlog.name, sizeof(newlog.name), "%s.%010d", config->szLogRoot,
tLogStart);
@@ -417,11 +430,13 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status)
fprintf(stderr, "Opening file %s\n", newlog.name);
}
rv = apr_file_open(&newlog.fd, newlog.name, APR_WRITE | APR_CREATE | APR_APPEND
- | (config->truncate ? APR_TRUNCATE : 0), APR_OS_DEFAULT, newlog.pool);
+ | (config->truncate || (config->num_files > 0 && status->current.fd) ? APR_TRUNCATE : 0),
+ APR_OS_DEFAULT, newlog.pool);
if (rv == APR_SUCCESS) {
/* Handle post-rotate processing. */
post_rotate(newlog.pool, &newlog, config, status);
+ status->fileNum = thisLogNum;
/* Close out old (previously 'current') logfile, if any. */
if (status->current.fd) {
close_logfile(config, &status->current);
@@ -550,9 +565,9 @@ int main (int argc, const char * const argv[])
apr_pool_create(&status.pool, NULL);
apr_getopt_init(&opt, status.pool, argc, argv);
#if APR_FILES_AS_SOCKETS
- while ((rv = apr_getopt(opt, "lL:p:ftvec", &c, &opt_arg)) == APR_SUCCESS) {
+ while ((rv = apr_getopt(opt, "lL:p:ftvecn:", &c, &opt_arg)) == APR_SUCCESS) {
#else
- while ((rv = apr_getopt(opt, "lL:p:ftve", &c, &opt_arg)) == APR_SUCCESS) {
+ while ((rv = apr_getopt(opt, "lL:p:ftven:", &c, &opt_arg)) == APR_SUCCESS) {
#endif
switch (c) {
case 'l':
@@ -581,6 +596,10 @@ int main (int argc, const char * const argv[])
config.create_empty = 1;
break;
#endif
+ case 'n':
+ config.num_files = atoi(opt_arg);
+ status.fileNum = -1;
+ break;
}
}
@@ -609,6 +628,16 @@ int main (int argc, const char * const argv[])
config.use_strftime = (strchr(config.szLogRoot, '%') != NULL);
+ if (config.use_strftime && config.num_files > 0) {
+ fprintf(stderr, "Cannot use -n with %% in filename\n");
+ exit(1);
+ }
+
+ if (status.fileNum == -1 && config.num_files < 1) {
+ fprintf(stderr, "Invalid -n argument\n");
+ exit(1);
+ }
+
if (apr_file_open_stdin(&f_stdin, status.pool) != APR_SUCCESS) {
fprintf(stderr, "Unable to open stdin\n");
exit(1);