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. +
-e
+
Echo logs through to stdout. Useful when logs need to be further +processed in real time by a further tool in the chain.
+
logfile

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