mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Fix syslog bug: if any messages are emitted to write_syslog before
the facility has been set, the facility gets set to LOCAL0 and cannot be changed later. This seems reasonably plausible to happen, particularly at higher debug log levels, though I am not certain it explains Han Holl's recent report. Easiest fix is to teach the code how to change the value on-the-fly, which is nicer anyway. I made the settings PGC_SIGHUP to conform with log_destination.
This commit is contained in:
@ -10,7 +10,7 @@
|
||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.291 2005/10/08 20:08:19 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.292 2005/10/14 20:53:56 tgl Exp $
|
||||
*
|
||||
*--------------------------------------------------------------------
|
||||
*/
|
||||
@ -21,6 +21,9 @@
|
||||
#include <limits.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#ifdef HAVE_SYSLOG
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
#include "utils/guc.h"
|
||||
#include "utils/guc_tables.h"
|
||||
@ -100,10 +103,11 @@ static const char *assign_log_destination(const char *value,
|
||||
bool doit, GucSource source);
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
extern char *Syslog_facility;
|
||||
extern char *Syslog_ident;
|
||||
static int syslog_facility = LOG_LOCAL0;
|
||||
|
||||
static const char *assign_facility(const char *facility,
|
||||
static const char *assign_syslog_facility(const char *facility,
|
||||
bool doit, GucSource source);
|
||||
static const char *assign_syslog_ident(const char *ident,
|
||||
bool doit, GucSource source);
|
||||
#endif
|
||||
|
||||
@ -192,6 +196,8 @@ static char *log_error_verbosity_str;
|
||||
static char *log_statement_str;
|
||||
static char *log_min_error_statement_str;
|
||||
static char *log_destination_string;
|
||||
static char *syslog_facility_str;
|
||||
static char *syslog_ident_str;
|
||||
static bool phony_autocommit;
|
||||
static bool session_auth_is_superuser;
|
||||
static double phony_random_seed;
|
||||
@ -1964,22 +1970,22 @@ static struct config_string ConfigureNamesString[] =
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
{
|
||||
{"syslog_facility", PGC_POSTMASTER, LOGGING_WHERE,
|
||||
{"syslog_facility", PGC_SIGHUP, LOGGING_WHERE,
|
||||
gettext_noop("Sets the syslog \"facility\" to be used when syslog enabled."),
|
||||
gettext_noop("Valid values are LOCAL0, LOCAL1, LOCAL2, LOCAL3, "
|
||||
"LOCAL4, LOCAL5, LOCAL6, LOCAL7.")
|
||||
},
|
||||
&Syslog_facility,
|
||||
"LOCAL0", assign_facility, NULL
|
||||
&syslog_facility_str,
|
||||
"LOCAL0", assign_syslog_facility, NULL
|
||||
},
|
||||
{
|
||||
{"syslog_ident", PGC_POSTMASTER, LOGGING_WHERE,
|
||||
gettext_noop("Sets the program name used to identify PostgreSQL messages "
|
||||
"in syslog."),
|
||||
{"syslog_ident", PGC_SIGHUP, LOGGING_WHERE,
|
||||
gettext_noop("Sets the program name used to identify PostgreSQL "
|
||||
"messages in syslog."),
|
||||
NULL
|
||||
},
|
||||
&Syslog_ident,
|
||||
"postgres", NULL, NULL
|
||||
&syslog_ident_str,
|
||||
"postgres", assign_syslog_ident, NULL
|
||||
},
|
||||
#endif
|
||||
|
||||
@ -5552,27 +5558,49 @@ assign_log_destination(const char *value, bool doit, GucSource source)
|
||||
#ifdef HAVE_SYSLOG
|
||||
|
||||
static const char *
|
||||
assign_facility(const char *facility, bool doit, GucSource source)
|
||||
assign_syslog_facility(const char *facility, bool doit, GucSource source)
|
||||
{
|
||||
int syslog_fac;
|
||||
|
||||
if (pg_strcasecmp(facility, "LOCAL0") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL1") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL2") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL3") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL4") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL5") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL6") == 0)
|
||||
return facility;
|
||||
if (pg_strcasecmp(facility, "LOCAL7") == 0)
|
||||
return facility;
|
||||
return NULL;
|
||||
syslog_fac = LOG_LOCAL0;
|
||||
else if (pg_strcasecmp(facility, "LOCAL1") == 0)
|
||||
syslog_fac = LOG_LOCAL1;
|
||||
else if (pg_strcasecmp(facility, "LOCAL2") == 0)
|
||||
syslog_fac = LOG_LOCAL2;
|
||||
else if (pg_strcasecmp(facility, "LOCAL3") == 0)
|
||||
syslog_fac = LOG_LOCAL3;
|
||||
else if (pg_strcasecmp(facility, "LOCAL4") == 0)
|
||||
syslog_fac = LOG_LOCAL4;
|
||||
else if (pg_strcasecmp(facility, "LOCAL5") == 0)
|
||||
syslog_fac = LOG_LOCAL5;
|
||||
else if (pg_strcasecmp(facility, "LOCAL6") == 0)
|
||||
syslog_fac = LOG_LOCAL6;
|
||||
else if (pg_strcasecmp(facility, "LOCAL7") == 0)
|
||||
syslog_fac = LOG_LOCAL7;
|
||||
else
|
||||
return NULL; /* reject */
|
||||
|
||||
if (doit)
|
||||
{
|
||||
syslog_facility = syslog_fac;
|
||||
set_syslog_parameters(syslog_ident_str ? syslog_ident_str : "postgres",
|
||||
syslog_facility);
|
||||
}
|
||||
|
||||
return facility;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const char *
|
||||
assign_syslog_ident(const char *ident, bool doit, GucSource source)
|
||||
{
|
||||
if (doit)
|
||||
set_syslog_parameters(ident, syslog_facility);
|
||||
|
||||
return ident;
|
||||
}
|
||||
|
||||
#endif /* HAVE_SYSLOG */
|
||||
|
||||
|
||||
static const char *
|
||||
|
Reference in New Issue
Block a user