Please find attached a patch to integrate rotatelogs into pg_ctl. I've
noticed a couple of questions about how to do this and it seems easier
(and more elegant) to solve it in code rather than in documentation. The
patch is pretty simple and I've made it reasonably self documenting. It
test for apache rotatelogs only when unless it is specifically used.
This code only adds functionality and causes no changes to current usage.
If anyone has suggestions how I could improve it or make it more
acceptable in any way, I'd very much like to hear them.
Andrew Hammond
--- pg_ctl_orig 2004-03-19 14:01:40.000000000 -0500
+++ pg_ctl_new 2004-03-24 15:30:29.000000000 -0500
@@ -39,6 +39,9 @@
Options for start or restart:
-l FILENAME write (or append) server log to FILENAME. The
use of this option is highly recommended.
+ -r ROTATIONTIME pipe through apache's rotatelogs instead of writing
+ dirrectly to FILENAME. Rotate the logs every
+ ROTATIONTIME seconds (see rotatelogs man page)
-o OPTIONS command line options to pass to the postmaster
(PostgreSQL server executable)
-p PATH-TO-POSTMASTER normally not necessary
@@ -62,6 +65,10 @@
VERSION='7.4.2'
DEF_PGPORT='5432'
+# how should this be dealt with by autoconf?
+apache_bindir='/usr/bin'
+rotatelogs_path="$apache_bindir/rotatelogs"
+
# protect the log file
umask 077
@@ -114,6 +121,7 @@
wait=
wait_seconds=60
logfile=
+rotation_time=
silence_echo=
shutdown_mode=smart
PGDATAOPTS=""
@@ -143,6 +151,12 @@
-l*)
logfile=`echo "$1" | sed 's/^-l//'`
;;
+ -r)
+ rotation_time="$2"
+ shift;;
+ -r*)
+ rotation_time=`echo "$1" | sed 's/^-m//'`
+ ;;
-m)
shutdown_mode="$2"
shift;;
@@ -207,6 +221,18 @@
exit 1
fi
+if [ ! x"$rotation_time" = x"" ]; then
+ if [ ! -x $rotatelogs_path ]; then
+ echo "$CMDNAME: log rotation specified but can't find $rotatelogs_path" 1>&2
+ exit 1
+ fi
+
+ if [ x"$logfile" = x"" ]; then
+ echo "$CMDNAME: log rotation specified but no logfile given. Use the -l option." 1>&2
+ exit 1
+ fi
+fi
+
if [ -z "$wait" ]; then
case "$op" in
start) wait=no;;
@@ -338,7 +364,11 @@
fi
if [ -n "$logfile" ]; then
+ if [ -n "$rotation_time" ]; then # use rotatelogs for logging
+ "$po_path" ${1+"$@"} ${PGDATAOPTS+$PGDATAOPTS} </dev/null 2>&1 | "$rotatelogs_path" $logfile
$rotation_time&
+ else
"$po_path" ${1+"$@"} ${PGDATAOPTS+$PGDATAOPTS} </dev/null >>$logfile 2>&1 &
+ fi
else
# when starting without log file, redirect stderr to stdout, so
# pg_ctl can be invoked with >$logfile and still have pg_ctl's