rotatelogs integration in pg_ctl

Started by Andrew Hammondalmost 22 years ago8 messages
#1Andrew Hammond
ahammond@ca.afilias.info
1 attachment(s)

I've attached a patch for pg_ctl which integrates the Apache project's
rotatelogs for logging. Is there any interested in the community for
such a thing? I have not yet added the appropriate stuff to autoconf to
completely integrate this.

I would appreciate any suggestions for improvement.

Drew

Attachments:

pg_ctl_rotatelogs_0_2.patchtext/x-patch; name=pg_ctl_rotatelogs_0_2.patchDownload
--- pg_ctl	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         use apache's rotatelogs instead of writing
+                          dirrectly tto FILENAME. Rotate the logs every 
+			  ROTATIONTIME seconds (see man for rotatelogs)
   -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'
 
+# have autoconf detect this?
+apache_bindir='/opt/OXRS/apache/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. Try 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
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Hammond (#1)
Re: rotatelogs integration in pg_ctl

Andrew Hammond <ahammond@ca.afilias.info> writes:

I've attached a patch for pg_ctl which integrates the Apache project's
rotatelogs for logging.

Why bother? You just pipe pg_ctl's output to rotatelogs and you're
done.

regards, tom lane

#3Andrew Hammond
ahammond@ca.afilias.info
In reply to: Tom Lane (#2)
Re: rotatelogs integration in pg_ctl

Tom Lane wrote:

Andrew Hammond <ahammond@ca.afilias.info> writes:

I've attached a patch for pg_ctl which integrates the Apache project's
rotatelogs for logging.

Why bother? You just pipe pg_ctl's output to rotatelogs and you're
done.

It's not difficult to do, once you know how and once you know that there
aren't any gotchas. However, the question comes up often enough it's
clear that not everybody knows how. This provides a simple, clean,
standardized way of using rotatelog. The patch is simple, low risk, and
limited impact. So, why not?

Drew

#4Thomas Swan
tswan@idigx.com
In reply to: Andrew Hammond (#3)
Re: rotatelogs integration in pg_ctl

<quote who="Andrew Hammond">

Tom Lane wrote:

Andrew Hammond <ahammond@ca.afilias.info> writes:

I've attached a patch for pg_ctl which integrates the Apache project's

rotatelogs for logging.

Why bother? You just pipe pg_ctl's output to rotatelogs and you're done.

It's not difficult to do, once you know how and once you know that there

aren't any gotchas. However, the question comes up often enough it's
clear that not everybody knows how. This provides a simple, clean,
standardized way of using rotatelog. The patch is simple, low risk, and
limited impact. So, why not?

Is there a reason the postmasters cannot just close/reopen-recreate the
log file when a SIGHUP or other signal is issued like apache? This would
allow for almost any scheme for log rotation to be handled by the system
or third party like logrotate and removes any duplicate effort between
projects.

I know on most distributions /var/log is not world writeable, so renaming
and and opening a file as postgres will not succeed. If the log files
are put in, for example, /var/log/pgsql with pgsql being rwx by postgres,
then it will work. The current packaging may need to be redone if you
want to enable loggin by default (if only startup and shutdown messages)

#5Bruno Wolff III
bruno@wolff.to
In reply to: Thomas Swan (#4)
Re: rotatelogs integration in pg_ctl

On Tue, Apr 13, 2004 at 09:33:42 -0500,
Thomas Swan <tswan@idigx.com> wrote:

Is there a reason the postmasters cannot just close/reopen-recreate the
log file when a SIGHUP or other signal is issued like apache? This would
allow for almost any scheme for log rotation to be handled by the system
or third party like logrotate and removes any duplicate effort between
projects.

Wouldn't that break logs piped to a program?

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Thomas Swan (#4)
Re: rotatelogs integration in pg_ctl

Thomas Swan wrote:

Is there a reason the postmasters cannot just close/reopen-recreate
the log file when a SIGHUP or other signal is issued like apache?

Yes, because there is no "log file". The postmaster writes to stdout or
stderr.

#7Thomas Swan
tswan@idigx.com
In reply to: Peter Eisentraut (#6)
Re: rotatelogs integration in pg_ctl

<quote who="Peter Eisentraut">

Thomas Swan wrote:

Is there a reason the postmasters cannot just close/reopen-recreate
the log file when a SIGHUP or other signal is issued like apache?

Yes, because there is no "log file". The postmaster writes to stdout or
stderr.

Ok, my misunderstanding. stdout/stderr are redirected to a file on
startup. This is why when I move/rename the logfile I have to stop/start
postgresql to start appending to the empty file.

Would there be any interest in modifying postmaster to support native file
logging in addition to stderr and stdout output? Are there any terrible
drawbacks that you could foresee?

#8Peter Eisentraut
peter_e@gmx.net
In reply to: Thomas Swan (#7)
Re: rotatelogs integration in pg_ctl

Thomas Swan wrote:

Would there be any interest in modifying postmaster to support native
file logging in addition to stderr and stdout output? Are there any
terrible drawbacks that you could foresee?

We have about 8 years of mailing list archives describing them.