From 7eb0262fdd0c1a12420a7075ca4e5f66a92b0f7e Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Thu, 13 Jun 2013 15:33:13 +0000 Subject: [PATCH] Merge r1490493, r1490761 from trunk: rotatelogs: add -n number-of-files option to roate through a number of fixed-name logfiles. don't truncate the very first file opened (unless the truncate flag is there too) Submitted by: covener Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1492708 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 2 ++ STATUS | 5 ---- docs/manual/programs/rotatelogs.xml | 6 +++++ support/rotatelogs.c | 39 +++++++++++++++++++++++++---- 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 @@ [ -v ] [ -e ] [ -c ] + [ -n number-of-files ] logfile rotationtime|filesize(B|K|M|G) [ offset ]

@@ -102,6 +103,11 @@ processed in real time by a further tool in the chain.
-c
Create log file for each interval, even if empty.
+
-n number-of-files
+
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".
+
logfile

The path plus basename of the logfile. If logfile 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] " + "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-c] [-n number] " #else - "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] " + "Usage: %s [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-n number] " #endif "{|(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); -- 2.40.0