From: Daniel Earl Poirier Date: Thu, 25 Feb 2010 18:00:42 +0000 (+0000) Subject: Add -L option to create a hard link to the current log file. X-Git-Tag: 2.3.6~442 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7335fa4f9e9d21f700d50f1b42f53222d946d61e;p=apache Add -L option to create a hard link to the current log file. PR: 48761 Submitted by: With additional changes by: poirier git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@916377 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 7a3b3a02f7..d4be4e4bb2 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.3.7 + *) support/rotatelogs: Add -L option to create a link to the current + log file. PR 48761 [, Dan Poirier] + *) mod_ldap: Update LDAPTrustedClientCert to consistently be a per-directory setting only, matching most of the documentation and examples. PR 46541 [Paul Reder, Eric Covener] diff --git a/docs/manual/programs/rotatelogs.xml b/docs/manual/programs/rotatelogs.xml index 7c7443a37b..9d55ec3895 100644 --- a/docs/manual/programs/rotatelogs.xml +++ b/docs/manual/programs/rotatelogs.xml @@ -35,6 +35,7 @@

rotatelogs [ -l ] + [ -L linkname ] [ -f ] [ -v ] logfile @@ -53,6 +54,12 @@ rotation. Note that using -l in an environment which changes the GMT offset (such as for BST or DST) can lead to unpredictable results! +

-L linkname
+
Causes a hard link to be made from the current logfile +to the specified link name. This can be used to watch +the log continuously across rotations using a command like +tail -F linkname.
+
-f
Causes the logfile to be opened immediately, as soon as rotatelogs starts, instead of waiting for the diff --git a/support/rotatelogs.c b/support/rotatelogs.c index a295ad0a7b..b011c358f8 100644 --- a/support/rotatelogs.c +++ b/support/rotatelogs.c @@ -89,6 +89,7 @@ struct rotate_config { int verbose; const char *szLogRoot; int truncate; + const char *linkfile; }; typedef struct rotate_status rotate_status_t; @@ -115,7 +116,7 @@ static void usage(const char *argv0, const char *reason) fprintf(stderr, "%s\n", reason); } fprintf(stderr, - "Usage: %s [-v] [-l] [-f] [-t] " + "Usage: %s [-v] [-l] [-L linkname] [-f] [-t] " "{|(B|K|M|G)} " "[offset minutes from UTC]\n\n", argv0); @@ -139,7 +140,9 @@ static void usage(const char *argv0, const char *reason) "when the file size\nis reached a new log is started. If the " "-t option is specified, the specified\nfile will be truncated " "instead of rotated, and is useful where tail is used to\n" - "process logs in real time.\n"); + "process logs in real time. If the -L option is specified, " + "a hard link will be\nmade from the current log file to the " + "specified filename.\n"); exit(1); } @@ -351,6 +354,20 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status) status->pfile_prev = NULL; } status->nMessCount = 0; + if (config->linkfile) { + apr_file_remove(config->linkfile, status->pfile); + if (config->verbose) { + fprintf(stderr,"Linking %s to %s\n", status->filename, config->linkfile); + } + rv = apr_file_link(status->filename, config->linkfile); + if (rv != APR_SUCCESS) { + char error[120]; + apr_strerror(rv, error, sizeof error); + fprintf(stderr, "Error linking file %s to %s (%s)\n", + status->filename, config->linkfile, error); + exit(2); + } + } } /* @@ -440,11 +457,14 @@ int main (int argc, const char * const argv[]) apr_pool_create(&status.pool, NULL); apr_getopt_init(&opt, status.pool, argc, argv); - while ((rv = apr_getopt(opt, "lftv", &c, &optarg)) == APR_SUCCESS) { + while ((rv = apr_getopt(opt, "lL:ftv", &c, &optarg)) == APR_SUCCESS) { switch (c) { case 'l': config.use_localtime = 1; break; + case 'L': + config.linkfile = optarg; + break; case 'f': config.force_open = 1; break;