On Saturday August 28 2004 9:30, Bruce Momjian wrote:
> Are we going to change this before beta2?  I have not seen a final
> patch yet.

Attached is a revised patch:

        + changes postgresql.conf option 'log_filename_prefix' to 'log_filename', 
and adds strftime() escape interpolation;
        + set default log_filename to 'postgresql-%Y-%m-%d_%H%M%S.log';
        + added postgresql.conf boolean option 'log_truncate_on_rotation', default 
false; 
        + log truncation is performed only on time-driven rotations and only when 
log_truncate_on_rotation is true;

I did not add UTC offset logic nor logic to shift to top of the hour/day for 
rotation periods of 60/1440 minutes, but would like to add that shortly if 
time permits.

Ed
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.279
diff -C1 -r1.279 runtime.sgml
*** doc/src/sgml/runtime.sgml	24 Aug 2004 00:06:50 -0000	1.279
--- doc/src/sgml/runtime.sgml	30 Aug 2004 01:46:31 -0000
***************
*** 1927,1930 ****
  
!      <varlistentry id="guc-log-filename-prefix" xreflabel="log_filename_prefix">
!       <term><varname>log_filename_prefix</varname> (<type>string</type>)</term>
         <listitem>
--- 1927,1930 ----
  
!      <varlistentry id="guc-log-filename" xreflabel="log_filename">
!       <term><varname>log_filename</varname> (<type>string</type>)</term>
         <listitem>
***************
*** 1932,1938 ****
            When <varname>redirect_stderr</> is enabled, this option
!           sets the prefix of the file names of the created log files.
!           The postmaster PID and the current time are appended to this
!           prefix to form an exact log file name.
!          This option can only be set at server start or in the
!          <filename>postgresql.conf</filename> configuration file.
          </para>
--- 1932,1955 ----
            When <varname>redirect_stderr</> is enabled, this option
!           sets the base name of the file name of the created log files.
!           Any strftime escapes will be interpolated per strftime().
!           If no strftime escapes are present, each new rotation will 
!           append the epoch of the new log file's open time.  For example,
!           if <varname>log_filename</> where 'server_log', then an
!           example log file upon rotation might be 'server_log.1093827753'
!           for a log starting at Sun Aug 29 19:02:33 2004 MST.
!         </para>
!        </listitem>
!      </varlistentry>
! 
!      <varlistentry id="guc-log-truncate-on-rotation" xreflabel="log_truncate_on_rotation">
!       <term><varname>log_truncate_on_rotation</varname> (<type>boolean</type>)</term>
!        <listitem>
!         <para>
!           When log rotation is enabled, this option will cause the
!           log rotation to truncate any existing log file by the same
!           name as the new log file in the rotation.  Note this only
!           applies to time-based log rotations; no log files will be 
!           truncated or overwritten on restarts or on size-based rotations.
!           Set to false to append to any existing files rather than 
!           truncate them.
          </para>
Index: src/backend/postmaster/syslogger.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/syslogger.c,v
retrieving revision 1.5
diff -C1 -r1.5 syslogger.c
*** src/backend/postmaster/syslogger.c	9 Aug 2004 20:28:48 -0000	1.5
--- src/backend/postmaster/syslogger.c	30 Aug 2004 01:46:33 -0000
***************
*** 64,66 ****
  char *      Log_directory = "pg_log";
! char *      Log_filename_prefix = "postgresql-";
  
--- 64,67 ----
  char *      Log_directory = "pg_log";
! char *      Log_filename = "postgresql-%Y-%m-%d_%H%M%S.log";
! bool        Log_truncate_on_rotation = false;
  
***************
*** 82,83 ****
--- 83,86 ----
  
+ static bool time_based_rotation = false;
+ 
  /* These must be exported for EXEC_BACKEND case ... annoying */
***************
*** 122,123 ****
--- 125,127 ----
  	char         currentLogDir[MAXPGPATH];
+ 	char         currentLogFilename[MAXPGPATH];
  
***************
*** 219,222 ****
  	last_rotation_time = time(NULL);
! 	/* remember active logfile directory */
  	strncpy(currentLogDir, Log_directory, MAXPGPATH);
  
--- 223,227 ----
  	last_rotation_time = time(NULL);
! 	/* remember active logfile directory and filename */
  	strncpy(currentLogDir, Log_directory, MAXPGPATH);
+ 	strncpy(currentLogFilename, Log_filename, MAXPGPATH);
  
***************
*** 234,235 ****
--- 239,242 ----
  
+ 		time_based_rotation = false;
+ 
  		if (got_SIGHUP)
***************
*** 240,247 ****
  			/*
! 			 * Check if the log directory changed in postgresql.conf. If so,
! 			 * force rotation to make sure we're writing the logfiles in the
! 			 * right place.
! 			 *
! 			 * XXX is it worth responding similarly to a change of
! 			 * Log_filename_prefix?
  			 */
--- 247,251 ----
  			/*
! 			 * Check if the log directory or filename prefix changed in 
! 			 * postgresql.conf. If so, force rotation to make sure we're 
! 			 * writing the logfiles in the right place.
  			 */
***************
*** 252,253 ****
--- 256,262 ----
  			}
+ 			if (strncmp(Log_filename, currentLogFilename, MAXPGPATH) != 0)
+ 			{
+ 				strncpy(currentLogFilename, Log_filename, MAXPGPATH);
+ 				rotation_requested = true;
+ 			}
  		}
***************
*** 266,268 ****
  			if (elapsed_secs >= Log_RotationAge * 60)
! 				rotation_requested = true;
  		}
--- 275,277 ----
  			if (elapsed_secs >= Log_RotationAge * 60)
! 				rotation_requested = time_based_rotation = true;
  		}
***************
*** 737,739 ****
  
! 	fh = fopen(filename, "a");
  	if (!fh)
--- 746,752 ----
  
! 	if (Log_truncate_on_rotation && time_based_rotation)
! 		fh = fopen(filename, "w");
! 	else
! 		fh = fopen(filename, "a");
! 
  	if (!fh)
***************
*** 791,796 ****
  	char *filename;
! 	char stamptext[128];
! 
! 	pg_strftime(stamptext, sizeof(stamptext), "%Y-%m-%d_%H%M%S",
! 				pg_localtime(&timestamp));
  
--- 804,807 ----
  	char *filename;
! 	int len;
! 	struct pg_tm *now;
  
***************
*** 799,807 ****
  	if (is_absolute_path(Log_directory))
! 		snprintf(filename, MAXPGPATH, "%s/%s%05u_%s.log",
! 				 Log_directory, Log_filename_prefix,
! 				 (unsigned int) PostmasterPid, stamptext);
  	else
! 		snprintf(filename, MAXPGPATH, "%s/%s/%s%05u_%s.log",
! 				 DataDir, Log_directory, Log_filename_prefix,
! 				 (unsigned int) PostmasterPid, stamptext);
  
--- 810,827 ----
  	if (is_absolute_path(Log_directory))
! 		snprintf(filename, MAXPGPATH, "%s/", Log_directory);
  	else
! 		snprintf(filename, MAXPGPATH, "%s/%s/", DataDir, Log_directory);
! 
! 	len = strnlen(filename, MAXPGPATH);
! 	now = pg_gmtime(&timestamp);
! 
! 	if (strstr(Log_filename, "%")) 
! 		pg_strftime((char*) (filename + len), MAXPGPATH - len, Log_filename, now);
! 	else 
! 	{
! 		/* no strftime() escapes, so append timestamp to new filename */
! 		snprintf((char*) (filename + len), MAXPGPATH - len, "%s", Log_filename);
! 		len = strnlen(filename, MAXPGPATH);
! 		snprintf((char*) (filename + len), MAXPGPATH - len, ".%d", timestamp);
! 	}
  
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.232
diff -C1 -r1.232 guc.c
*** src/backend/utils/misc/guc.c	16 Aug 2004 02:12:29 -0000	1.232
--- src/backend/utils/misc/guc.c	30 Aug 2004 01:46:39 -0000
***************
*** 813,814 ****
--- 813,822 ----
  	},
+ 	{
+ 		{"log_truncate_on_rotation", PGC_POSTMASTER, LOGGING_WHERE,
+ 		 gettext_noop("Truncate existing logfiles by same name during log rotation"),
+ 		 NULL
+ 		},
+ 		&Log_truncate_on_rotation,
+ 		false, NULL, NULL
+ 	},
  
***************
*** 1673,1681 ****
  	},
  	{
! 		{"log_filename_prefix", PGC_SIGHUP, LOGGING_WHERE,
! 		 gettext_noop("Prefix for file names created in the log_directory."),
  		 NULL
  		},
! 		&Log_filename_prefix,
! 		"postgresql-", NULL, NULL
  	},
--- 1681,1690 ----
  	},
+ 
  	{
! 		{"log_filename", PGC_SIGHUP, LOGGING_WHERE,
! 		 gettext_noop("File name to be used for log files."),
  		 NULL
  		},
! 		&Log_filename,
! 		"postgresql-%Y-%m-%d_%H%M%S.log", NULL, NULL
  	},
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.126
diff -C1 -r1.126 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample	12 Aug 2004 19:03:36 -0000	1.126
--- src/backend/utils/misc/postgresql.conf.sample	30 Aug 2004 01:46:40 -0000
***************
*** 175,177 ****
                              # May be specified absolute or relative to PGDATA
! #log_filename_prefix = 'postgresql_' # Prefix for logfile names.
  #log_rotation_age = 1440    # Automatic rotation of logfiles will happen after
--- 175,185 ----
                              # May be specified absolute or relative to PGDATA
! #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # Logfile name, may include
!                             # strftime() escapes
! #log_truncate_on_rotation = false  # If true, any existing logfile by the 
!                             # same name as the new logfile upon time-driven
!                             # rotation only will be truncated.  Note 
!                             # truncation only occurs on time-driven rotation,
!                             # not on restarts or size-driven rotation.
!                             # Default is false, meaning append to existing 
!                             # files in all cases.
  #log_rotation_age = 1440    # Automatic rotation of logfiles will happen after
Index: src/include/postmaster/syslogger.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/postmaster/syslogger.h,v
retrieving revision 1.1
diff -C1 -r1.1 syslogger.h
*** src/include/postmaster/syslogger.h	5 Aug 2004 23:32:12 -0000	1.1
--- src/include/postmaster/syslogger.h	30 Aug 2004 01:46:40 -0000
***************
*** 19,21 ****
  extern char *Log_directory;
! extern char *Log_filename_prefix;
  
--- 19,22 ----
  extern char *Log_directory;
! extern char *Log_filename;
! extern bool Log_truncate_on_rotation;
  
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to