Index: test/test =================================================================== --- test/test.orig +++ test/test @@ -427,4 +427,26 @@ test.log 0 test.log.1 0 zero EOF +# check rotation with extension appended to the filename +cleanup 17 + +preptest test.log 17 1 0 +$RLR test-config.17 --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 @@ -248,6 +248,15 @@ appears after \fIext\fR. For example you and want to rotate it to mylog.1.foo.gz instead of mylog.foo.1.gz. .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 @@ -867,6 +867,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 @@ -44,6 +44,7 @@ struct logInfo { char *pre, *post, *first, *last; char *logAddress; char *extension; + char *addextension; char *compress_prog; char *uncompress_prog; char *compress_ext; Index: test/test-config.17.in =================================================================== --- /dev/null +++ test/test-config.17.in @@ -0,0 +1,7 @@ +create + +&DIR&/test.log { + monthly + rotate 1 + addextension .newext +} Index: test/test-config.18.in =================================================================== --- /dev/null +++ test/test-config.18.in @@ -0,0 +1,7 @@ +create + +&DIR&/test.log { + monthly + rotate 1 + addextension .log +}