1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-12 05:01:15 +03:00

Remove 'syslog' GUC variable, and add more logical 'log_destination'

variable to control logoutput location on Unix and Win32.

Magnus Hagander
This commit is contained in:
Bruce Momjian
2004-04-05 03:02:11 +00:00
parent a12fc7dae6
commit 6165bbab8c
8 changed files with 180 additions and 69 deletions

View File

@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.131 2004/03/22 15:34:22 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.132 2004/04/05 03:02:06 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -70,25 +70,17 @@ ErrorContextCallback *error_context_stack = NULL;
/* GUC parameters */
PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
char *Log_line_prefix = NULL; /* format for extra log line info */
unsigned int Log_destination;
#ifdef HAVE_SYSLOG
/*
* 0 = only stdout/stderr
* 1 = stdout+stderr and syslog
* 2 = syslog only
* ... in theory anyway
*/
int Use_syslog = 0;
char *Syslog_facility; /* openlog() parameters */
char *Syslog_ident;
static void write_syslog(int level, const char *line);
#else
#define Use_syslog 0
#endif /* HAVE_SYSLOG */
#endif
#ifdef WIN32
static void write_eventlog(int level, const char *line);
#endif
/*
* ErrorData holds the data accumulated during any one ereport() cycle.
@@ -1005,9 +997,6 @@ write_syslog(int level, const char *line)
int len = strlen(line);
if (Use_syslog == 0)
return;
if (!openlog_done)
{
if (strcasecmp(Syslog_facility, "LOCAL0") == 0)
@@ -1099,6 +1088,34 @@ write_syslog(int level, const char *line)
}
}
#endif /* HAVE_SYSLOG */
#ifdef WIN32
/*
* Write a message line to the windows event log
*/
static void
write_eventlog(int level, const char *line)
{
static HANDLE evtHandle = INVALID_HANDLE_VALUE;
if (evtHandle == INVALID_HANDLE_VALUE) {
evtHandle = RegisterEventSource(NULL,"PostgreSQL");
if (evtHandle == NULL) {
evtHandle = INVALID_HANDLE_VALUE;
return;
}
}
ReportEvent(evtHandle,
level,
0,
0, /* All events are Id 0 */
NULL,
1,
0,
&line,
NULL);
}
#endif /* WIN32*/
/*
* Format tag info for log lines; append to the provided buffer.
@@ -1344,7 +1361,7 @@ send_message_to_server_log(ErrorData *edata)
#ifdef HAVE_SYSLOG
/* Write to syslog, if enabled */
if (Use_syslog >= 1)
if (Log_destination & LOG_DESTINATION_SYSLOG)
{
int syslog_level;
@@ -1381,9 +1398,38 @@ send_message_to_server_log(ErrorData *edata)
write_syslog(syslog_level, buf.data);
}
#endif /* HAVE_SYSLOG */
#ifdef WIN32
if (Log_destination & LOG_DESTINATION_EVENTLOG)
{
int eventlog_level;
switch (edata->elevel)
{
case DEBUG5:
case DEBUG4:
case DEBUG3:
case DEBUG2:
case DEBUG1:
case LOG:
case COMMERROR:
case INFO:
case NOTICE:
eventlog_level = EVENTLOG_INFORMATION_TYPE;
break;
case WARNING:
eventlog_level = EVENTLOG_WARNING_TYPE;
break;
case ERROR:
case FATAL:
case PANIC:
default:
eventlog_level = EVENTLOG_ERROR_TYPE;
break;
}
write_eventlog(eventlog_level, buf.data);
}
#endif /* WIN32 */
/* Write to stderr, if enabled */
if (Use_syslog <= 1 || whereToSendOutput == Debug)
if ((Log_destination & LOG_DESTINATION_STDERR) || whereToSendOutput == Debug)
{
fprintf(stderr, "%s", buf.data);
}

View File

@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.196 2004/04/05 02:48:09 momjian Exp $
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.197 2004/04/05 03:02:07 momjian Exp $
*
*--------------------------------------------------------------------
*/
@@ -75,6 +75,9 @@ extern int CommitSiblings;
extern char *preload_libraries_string;
extern int DebugSharedBuffers;
static const char *assign_log_destination(const char *value,
bool doit, GucSource source);
#ifdef HAVE_SYSLOG
extern char *Syslog_facility;
extern char *Syslog_ident;
@@ -143,6 +146,7 @@ static char *client_min_messages_str;
static char *log_min_messages_str;
static char *log_error_verbosity_str;
static char *log_min_error_statement_str;
static char *log_destination_string;
static bool phony_autocommit;
static bool session_auth_is_superuser;
static double phony_random_seed;
@@ -279,8 +283,8 @@ const char *const config_group_names[] =
gettext_noop("Query Tuning / Other Planner Options"),
/* LOGGING */
gettext_noop("Reporting and Logging"),
/* LOGGING_SYSLOG */
gettext_noop("Reporting and Logging / Syslog"),
/* LOGGING_WHERE */
gettext_noop("Reporting and Logging / Where to Log"),
/* LOGGING_WHEN */
gettext_noop("Reporting and Logging / When to Log"),
/* LOGGING_WHAT */
@@ -933,20 +937,6 @@ static struct config_int ConfigureNamesInt[] =
1000, 0, INT_MAX, NULL, NULL
},
#ifdef HAVE_SYSLOG
{
{"syslog", PGC_SIGHUP, LOGGING_SYSLOG,
gettext_noop("Uses syslog for logging."),
gettext_noop("If this parameter is 1, messages go both to syslog "
"and the standard output. A value of 2 sends output only to syslog. "
"(Some messages will still go to the standard output/error.) The "
"default is 0, which means syslog is off.")
},
&Use_syslog,
0, 0, 2, NULL, NULL
},
#endif
/*
* Note: There is some postprocessing done in PostmasterMain() to make
* sure the buffers are at least twice the number of backends, so the
@@ -1644,9 +1634,20 @@ static struct config_string ConfigureNamesString[] =
NULL, assign_session_authorization, show_session_authorization
},
{
{"log_destination", PGC_POSTMASTER, LOGGING_WHERE,
gettext_noop("Sets the target for log output."),
gettext_noop("Valid values are combinations of stderr, syslog "
"and eventlog, depending on platform."),
GUC_LIST_INPUT | GUC_REPORT
},
&log_destination_string,
"stderr", assign_log_destination, NULL
},
#ifdef HAVE_SYSLOG
{
{"syslog_facility", PGC_POSTMASTER, LOGGING_SYSLOG,
{"syslog_facility", PGC_POSTMASTER, 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.")
@@ -1655,7 +1656,7 @@ static struct config_string ConfigureNamesString[] =
"LOCAL0", assign_facility, NULL
},
{
{"syslog_ident", PGC_POSTMASTER, LOGGING_SYSLOG,
{"syslog_ident", PGC_POSTMASTER, LOGGING_WHERE,
gettext_noop("Sets the program name used to identify PostgreSQL messages "
"in syslog."),
NULL
@@ -4418,6 +4419,68 @@ GUCArrayDelete(ArrayType *array, const char *name)
* assign_hook subroutines
*/
static const char *
assign_log_destination(const char *value, bool doit, GucSource source)
{
char *rawstring;
List *elemlist;
List *l;
unsigned int newlogdest = 0;
/* Need a modifiable copy of string */
rawstring = pstrdup(value);
/* Parse string into list of identifiers */
if (!SplitIdentifierString(rawstring, ',', &elemlist))
{
/* syntax error in list */
pfree(rawstring);
freeList(elemlist);
if (source >= PGC_S_INTERACTIVE)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid list syntax for parameter \"log_destination\"")));
return NULL;
}
foreach(l, elemlist)
{
char *tok = (char *) lfirst(l);
if (strcasecmp(tok,"stderr") == 0)
newlogdest |= LOG_DESTINATION_STDERR;
#ifdef HAVE_SYSLOG
else if (strcasecmp(tok,"syslog") == 0)
newlogdest |= LOG_DESTINATION_SYSLOG;
#endif
#ifdef WIN32
else if (strcasecmp(tok,"eventlog") == 0)
newlogdest |= LOG_DESTINATION_EVENTLOG;
#endif
else {
if (source >= PGC_S_INTERACTIVE)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("unrecognised \"log_destination\" key word: \"%s\"",
tok)));
pfree(rawstring);
freeList(elemlist);
return NULL;
}
}
pfree(rawstring);
freeList(elemlist);
/* If we aren't going to do the assignment, just return OK indicator. */
if (!doit)
return value;
Log_destination = newlogdest;
return value;
}
#ifdef HAVE_SYSLOG
static const char *

View File

@@ -145,9 +145,11 @@
# ERROR REPORTING AND LOGGING
#---------------------------------------------------------------------------
# - Syslog -
# - Where to Log -
#syslog = 0 # range 0-2; 0=stdout; 1=both; 2=syslog
#log_destination = 'stderr' # Valid values are combinations of stderr,
# syslog and eventlog, depending on
# platform.
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'