aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2013-08-13 15:24:56 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2013-08-13 15:24:56 -0400
commit6d8186ff779fd46f0251eb252e7489fd38ab793b (patch)
treec093ba3eca212d154f15bdaba605ba55a1ba07b4 /src/backend
parent7cf5540c831460476d24566845422b8c81bd6581 (diff)
downloadpostgresql-6d8186ff779fd46f0251eb252e7489fd38ab793b.tar.gz
postgresql-6d8186ff779fd46f0251eb252e7489fd38ab793b.zip
Emit a log message if output is about to be redirected away from stderr.
We've seen multiple cases of people looking at the postmaster's original stderr output to try to diagnose problems, not realizing/remembering that their logging configuration is set up to send log messages somewhere else. This seems particularly likely to happen in prepackaged distributions, since many packagers patch the code to change the factory-standard logging configuration to something more in line with their platform conventions. In hopes of reducing confusion, emit a LOG message about this at the point in startup where we are about to switch log output away from the original stderr, providing a pointer to where to look instead. This message will appear as the last thing in the original stderr output. (We might later also try to emit such link messages when logging parameters are changed on-the-fly; but that case seems to be both noticeably harder to do nicely, and much less frequently a problem in practice.) Per discussion, back-patch to 9.3 but not further.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/postmaster/postmaster.c10
-rw-r--r--src/backend/postmaster/syslogger.c16
-rw-r--r--src/backend/utils/error/elog.c1
-rw-r--r--src/backend/utils/misc/guc.c4
4 files changed, 26 insertions, 5 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 55471085086..75f2f82548f 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -1183,7 +1183,17 @@ PostmasterMain(int argc, char *argv[])
* Log_destination permits. We don't do this until the postmaster is
* fully launched, since startup failures may as well be reported to
* stderr.
+ *
+ * If we are in fact disabling logging to stderr, first emit a log message
+ * saying so, to provide a breadcrumb trail for users who may not remember
+ * that their logging is configured to go somewhere else.
*/
+ if (!(Log_destination & LOG_DESTINATION_STDERR))
+ ereport(LOG,
+ (errmsg("ending log output to stderr"),
+ errhint("Future log output will go to log destination \"%s\".",
+ Log_destination_string)));
+
whereToSendOutput = DestNone;
/*
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index e3b61025162..8b00aa525b2 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -634,6 +634,20 @@ SysLogger_Start(void)
/* now we redirect stderr, if not done already */
if (!redirection_done)
{
+#ifdef WIN32
+ int fd;
+#endif
+
+ /*
+ * Leave a breadcrumb trail when redirecting, in case the user
+ * forgets that redirection is active and looks only at the
+ * original stderr target file.
+ */
+ ereport(LOG,
+ (errmsg("redirecting log output to logging collector process"),
+ errhint("Future log output will appear in directory \"%s\".",
+ Log_directory)));
+
#ifndef WIN32
fflush(stdout);
if (dup2(syslogPipe[1], fileno(stdout)) < 0)
@@ -649,8 +663,6 @@ SysLogger_Start(void)
close(syslogPipe[1]);
syslogPipe[1] = -1;
#else
- int fd;
-
/*
* open the pipe in binary mode and make sure stderr is binary
* after it's been dup'ed into, to avoid disturbing the pipe
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 7f03f419dea..cebfeebad73 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -109,6 +109,7 @@ emit_log_hook_type emit_log_hook = NULL;
int Log_error_verbosity = PGERROR_VERBOSE;
char *Log_line_prefix = NULL; /* format for extra log line info */
int Log_destination = LOG_DESTINATION_STDERR;
+char *Log_destination_string = NULL;
#ifdef HAVE_SYSLOG
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index b53fdc2be37..a055231cfc0 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -442,8 +442,6 @@ int tcp_keepalives_count;
* cases provide the value for SHOW to display. The real state is elsewhere
* and is kept in sync by assign_hooks.
*/
-static char *log_destination_string;
-
static char *syslog_ident_str;
static bool phony_autocommit;
static bool session_auth_is_superuser;
@@ -2833,7 +2831,7 @@ static struct config_string ConfigureNamesString[] =
"depending on the platform."),
GUC_LIST_INPUT
},
- &log_destination_string,
+ &Log_destination_string,
"stderr",
check_log_destination, assign_log_destination, NULL
},