]> granicus.if.org Git - apache/commitdiff
Tweak rotatelogs -p such that the program is invoked the first time a
authorJoe Orton <jorton@apache.org>
Mon, 27 Jun 2011 10:57:10 +0000 (10:57 +0000)
committerJoe Orton <jorton@apache.org>
Mon, 27 Jun 2011 10:57:10 +0000 (10:57 +0000)
new log file is opened as well as for rotations:

* support/rotatelogs.c (usage): Update.
  (post_rotate): Omit third arg if no prev logfile known.
  (doRotate): Invoke even if no previous logfile was open.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1140099 13f79535-47bb-0310-9956-ffa450edef68

docs/manual/programs/rotatelogs.xml
support/rotatelogs.c

index 8e3d75c14ec2c9420286261fe5e408985236f272..63c08d17a86e15bb8c4ba756b22f1365c805ecbd 100644 (file)
@@ -61,13 +61,16 @@ the log continuously across rotations using a command like
 <code>tail -F linkname</code>.</dd>
 
 <dt><code>-p</code> <var>program</var></dt>
-<dd>Causes the specified program to be executed after each rotation.
-Two arguments are supplied upon execution: the newly opened file and
-the previous file, respectively.  <code>rotatelogs</code> does not
-wait for the specified program to terminate before continuing to
-operate, and will not log any error code returned on termination.  The
-spawned program uses the same stdin, stdout, and stderr as rotatelogs
-itself, and also inherits the environment.</dd>
+
+<dd>If given, <code>rotatelogs</code> will execute the specified
+program every time a new log file is opened.  The filename of the
+newly opened file is passed as the first argument to the program.  If
+executing after a rotation, the old log file is passed as the second
+argument.  <code>rotatelogs</code> does not wait for the specified
+program to terminate before continuing to operate, and will not log
+any error code returned on termination.  The spawned program uses the
+same stdin, stdout, and stderr as rotatelogs itself, and also inherits
+the environment.</dd>
 
 <dt><code>-f</code></dt>
 <dd>Causes the logfile to be opened immediately, as soon as
index 75656bc6fc7f53fd87766b13d9e1285130696483..733035c0cff5873e6b6add538fc0e3203192e449 100644 (file)
@@ -149,16 +149,14 @@ static void usage(const char *argv0, const char *reason)
             "  -v       Verbose operation. Messages are written to stderr.\n"
             "  -l       Base rotation on local time instead of UTC.\n"
             "  -L path  Create hard link from current log to specified path.\n"
-            "  -p prog  Run specified program on log rotation. See below.\n"
+            "  -p prog  Run specified program after opening a new log file. See below.\n"
             "  -f       Force opening of log on program start.\n"
             "  -t       Truncate logfile instead of rotating, tail friendly.\n"
             "  -e       Echo log to stdout for further processing.\n"
             "\n"
-            "The post-rotation program must be an executable program or script.\n"
-            "Scripts are supported as long as the shebang line uses a working\n"
-            "interpreter. The program is invoked as \"[prog] <curfile> <prevfile>\"\n"
-            "where <curfile> is the filename of the currently used logfile, and\n"
-            "<prevfile> is the filename of the previously used logfile.\n"
+            "The program is invoked as \"[prog] <curfile> [<prevfile>]\"\n"
+            "where <curfile> is the filename of the newly opened logfile, and\n"
+            "<prevfile>, if given, is the filename of the previously used logfile.\n"
             "\n");
     exit(1);
 }
@@ -313,8 +311,13 @@ static void post_rotate(apr_pool_t *pool, rotate_config_t *config, rotate_status
 
     argv[0] = config->postrotate_prog;
     argv[1] = status->filename;
-    argv[2] = status->filenameprev;
-    argv[3] = NULL;
+    if (status->filenameprev[0]) {
+        argv[2] = status->filenameprev;
+        argv[3] = NULL;
+    }
+    else {
+        argv[2] = NULL;
+    }
 
     if (config->verbose)
         fprintf(stderr, "Calling post-rotate program: %s\n", argv[0]);
@@ -426,9 +429,8 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status)
         }
     }
     else {
-        /* If postrotate configured, and this is a real rotate rather
-         * than an initial open, run the post-rotate program: */
-        if (config->postrotate_prog && status->pfile_prev) {
+        /* If postrotate configured, run the post-rotate program: */
+        if (config->postrotate_prog) {
             post_rotate(status->pfile, config, status);
         }