From 74030fa378b9287f0388d6d90b02e386f09847d3 Mon Sep 17 00:00:00 2001
From: Graham Leggett
Date: Tue, 21 Dec 2010 17:52:43 +0000
Subject: [PATCH] rotatelogs: Add -e option to write logs through to stdout for
optional further processing.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1051582 13f79535-47bb-0310-9956-ffa450edef68
---
CHANGES | 3 +++
docs/manual/programs/rotatelogs.xml | 5 +++++
support/rotatelogs.c | 24 +++++++++++++++++++++---
3 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/CHANGES b/CHANGES
index 344cb8a173..c2c43cc281 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
Changes with Apache 2.3.11
+ *) rotatelogs: Add -e option to write logs through to stdout for optional
+ further processing. [Graham Leggett]
+
*) mod_ssl: Correctly read full lines in input filter when the line is
incomplete during first read. PR 50481. [Ruediger Pluem]
diff --git a/docs/manual/programs/rotatelogs.xml b/docs/manual/programs/rotatelogs.xml
index 1067dd39e4..ecb717659b 100644
--- a/docs/manual/programs/rotatelogs.xml
+++ b/docs/manual/programs/rotatelogs.xml
@@ -38,6 +38,7 @@
[ -L linkname ]
[ -f ]
[ -v ]
+ [ -e ]
logfile
rotationtime|filesize(B|K|M|G)
[ offset ]
@@ -80,6 +81,10 @@ will be respected.
the result of the configuration parsing, and all file open and
close actions.
+The path plus basename of the logfile. If logfile
diff --git a/support/rotatelogs.c b/support/rotatelogs.c
index 37f1109676..cb85458ede 100644
--- a/support/rotatelogs.c
+++ b/support/rotatelogs.c
@@ -87,6 +87,7 @@ struct rotate_config {
int use_strftime;
int force_open;
int verbose;
+ int echo;
const char *szLogRoot;
int truncate;
const char *linkfile;
@@ -116,7 +117,7 @@ static void usage(const char *argv0, const char *reason)
fprintf(stderr, "%s\n", reason);
}
fprintf(stderr,
- "Usage: %s [-v] [-l] [-L linkname] [-f] [-t] "
+ "Usage: %s [-v] [-l] [-L linkname] [-f] [-t] [-e] "
"{|(B|K|M|G)} "
"[offset minutes from UTC]\n\n",
argv0);
@@ -142,7 +143,8 @@ static void usage(const char *argv0, const char *reason)
"instead of rotated, and is useful where tail is used to\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");
+ "specified filename. In the case of the -e option, the log "
+ "will be echoed through to stdout for further processing.\n");
exit(1);
}
@@ -435,6 +437,7 @@ int main (int argc, const char * const argv[])
char buf[BUFSIZE];
apr_size_t nRead, nWrite;
apr_file_t *f_stdin;
+ apr_file_t *f_stdout;
apr_getopt_t *opt;
apr_status_t rv;
char c;
@@ -451,6 +454,7 @@ int main (int argc, const char * const argv[])
config.use_strftime = 0;
config.force_open = 0;
config.verbose = 0;
+ config.echo = 0;
status.pool = NULL;
status.pfile = NULL;
status.pfile_prev = NULL;
@@ -462,7 +466,7 @@ 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, "lL:ftv", &c, &opt_arg)) == APR_SUCCESS) {
+ while ((rv = apr_getopt(opt, "lL:ftve", &c, &opt_arg)) == APR_SUCCESS) {
switch (c) {
case 'l':
config.use_localtime = 1;
@@ -479,6 +483,9 @@ int main (int argc, const char * const argv[])
case 'v':
config.verbose = 1;
break;
+ case 'e':
+ config.echo = 1;
+ break;
}
}
@@ -512,6 +519,11 @@ int main (int argc, const char * const argv[])
exit(1);
}
+ if (apr_file_open_stdout(&f_stdout, status.pool) != APR_SUCCESS) {
+ fprintf(stderr, "Unable to open stdout\n");
+ exit(1);
+ }
+
/*
* Write out result of config parsing if verbose is set.
*/
@@ -575,6 +587,12 @@ int main (int argc, const char * const argv[])
else {
status.nMessCount++;
}
+ if (config.echo) {
+ if (apr_file_write_full(f_stdout, buf, nRead, &nWrite)) {
+ fprintf(stderr, "Unable to write to stdout\n");
+ exit(4);
+ }
+ }
}
/* Of course we never, but prevent compiler warnings */
return 0;
--
2.40.0