Index: test/test =================================================================== --- test/test.orig +++ test/test @@ -1599,4 +1599,27 @@ test.log 0 test.log.1 0 zero EOF +# check rotation with extension appended to the filename +cleanup 100 + +preptest test.log 100 1 0 +$RLR test-config.100 --force + +checkoutput <extension); + } else if (!strcmp(key, "addextension")) { + if ((key = isolateValue + (configFile, lineNum, "addextension name", &start, + &buf, length)) != NULL) { + freeLogItem (addextension); + newlog->addextension = key; + key = NULL; + } + else continue; + + message(MESS_DEBUG, "addextension is now %s\n", + newlog->addextension); + } else if (!strcmp(key, "compresscmd")) { freeLogItem (compress_prog); Index: logrotate.8 =================================================================== --- logrotate.8.orig +++ logrotate.8 @@ -283,6 +283,15 @@ configured to be run by cron daily. You and run \fIlogrotate\fR hourly to be able to really rotate logs hourly. .TP +\fBaddextension \fIext\fR +Log files are given the final extension \fIext\fR after rotation. If +the original file already ends with \fIext\fR, the extension is not +duplicated, but merely moved to the end, i.e. both \fBfilename\fR and +\fBfilename\fIext\fR would get rotated to filename.1\fIext\fR. If +compression is used, the compression extension (normally \fB.gz\fR) +appears after \fIext\fR. + +.TP \fBifempty\fR Rotate the log file even if it is empty, overriding the \fBnotifempty\fR option (\fBifempty\fR is the default). Index: logrotate.c =================================================================== --- logrotate.c.orig +++ logrotate.c @@ -1216,6 +1216,24 @@ int prerotateSingleLog(struct logInfo *l rotNames->baseName = strdup(ourBaseName(log->files[logNum])); + if (log->addextension) { + size_t baseLen = strlen(rotNames->baseName); + size_t extLen = strlen(log->addextension); + if (baseLen >= extLen && + strncmp(&(rotNames->baseName[baseLen - extLen]), + log->addextension, extLen) == 0) { + char *tempstr; + + fileext = log->addextension; + tempstr = calloc(baseLen - extLen + 1, sizeof(char)); + strncat(tempstr, rotNames->baseName, baseLen - extLen); + free(rotNames->baseName); + rotNames->baseName = tempstr; + } else { + fileext = log->addextension; + } + } + if (log->extension && strncmp(& (rotNames-> Index: logrotate.h =================================================================== --- logrotate.h.orig +++ logrotate.h @@ -54,6 +54,7 @@ struct logInfo { char *pre, *post, *first, *last, *preremove; char *logAddress; char *extension; + char *addextension; char *compress_prog; char *uncompress_prog; char *compress_ext; Index: test/test-config.100.in =================================================================== --- /dev/null +++ test/test-config.100.in @@ -0,0 +1,7 @@ +create + +&DIR&/test.log { + monthly + rotate 1 + addextension .newext +} Index: test/test-config.101.in =================================================================== --- /dev/null +++ test/test-config.101.in @@ -0,0 +1,7 @@ +create + +&DIR&/test.log { + monthly + rotate 1 + addextension .log +}