diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml
index 52bcf5e815..23681294b8 100644
--- a/doc/src/sgml/ref/pg_ctl-ref.sgml
+++ b/doc/src/sgml/ref/pg_ctl-ref.sgml
@@ -419,6 +419,22 @@ PostgreSQL documentation
Options for Windows
+
+
+
+
+ Name of the event source for pg_ctl to use
+ for logging to the event log when running as a Windows service. The
+ default is PostgreSQL. Note that this only controls
+ the logging from pg_ctl itself - once
+ started, the server will use the event source specified
+ by . Should the server fail during
+ early startup, it may also log using the default event
+ source PostgreSQL.
+
+
+
+
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 0d92dcd036..32a9663366 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -1989,7 +1989,8 @@ write_eventlog(int level, const char *line, int len)
if (evtHandle == INVALID_HANDLE_VALUE)
{
- evtHandle = RegisterEventSource(NULL, event_source ? event_source : "PostgreSQL");
+ evtHandle = RegisterEventSource(NULL,
+ event_source ? event_source : DEFAULT_EVENT_SOURCE);
if (evtHandle == NULL)
{
evtHandle = INVALID_HANDLE_VALUE;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 3a31a75191..6c52db8590 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -3019,7 +3019,7 @@ static struct config_string ConfigureNamesString[] =
NULL
},
&event_source,
- "PostgreSQL",
+ DEFAULT_EVENT_SOURCE,
NULL, NULL, NULL
},
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 9a6ade935f..edd202b7d7 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -89,6 +89,7 @@ static char *post_opts = NULL;
static const char *progname;
static char *log_file = NULL;
static char *exec_path = NULL;
+static char *event_source = NULL;
static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
static char *register_username = NULL;
static char *register_password = NULL;
@@ -178,7 +179,8 @@ write_eventlog(int level, const char *line)
if (evtHandle == INVALID_HANDLE_VALUE)
{
- evtHandle = RegisterEventSource(NULL, "PostgreSQL");
+ evtHandle = RegisterEventSource(NULL,
+ event_source ? event_source : DEFAULT_EVENT_SOURCE);
if (evtHandle == NULL)
{
evtHandle = INVALID_HANDLE_VALUE;
@@ -1406,6 +1408,9 @@ pgwin32_CommandLine(bool registration)
free(dataDir);
}
+ if (registration && event_source != NULL)
+ appendPQExpBuffer(cmdLine, " -e \"%s\"", event_source);
+
if (registration && do_wait)
appendPQExpBuffer(cmdLine, " -w");
@@ -1878,6 +1883,10 @@ do_help(void)
printf(_("\nCommon options:\n"));
printf(_(" -D, --pgdata=DATADIR location of the database storage area\n"));
printf(_(" -s, --silent only print errors, no informational messages\n"));
+#if defined(WIN32) || defined(__CYGWIN__)
+ printf(_(" -e SOURCE event source to use for logging when running\n"
+ " as a service\n"));
+#endif
printf(_(" -t, --timeout=SECS seconds to wait when using -w option\n"));
printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -w wait until operation completes\n"));
@@ -2140,7 +2149,7 @@ main(int argc, char **argv)
/* process command-line options */
while (optind < argc)
{
- while ((c = getopt_long(argc, argv, "cD:l:m:N:o:p:P:sS:t:U:wW", long_options, &option_index)) != -1)
+ while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW", long_options, &option_index)) != -1)
{
switch (c)
{
@@ -2168,6 +2177,9 @@ main(int argc, char **argv)
case 'm':
set_mode(optarg);
break;
+ case 'e':
+ event_source = pg_strdup(optarg);
+ break;
case 'N':
register_servicename = pg_strdup(optarg);
break;
diff --git a/src/bin/pgevent/pgevent.c b/src/bin/pgevent/pgevent.c
index 6a667812fb..83949c2cda 100644
--- a/src/bin/pgevent/pgevent.c
+++ b/src/bin/pgevent/pgevent.c
@@ -26,7 +26,7 @@ HANDLE g_module = NULL; /* hModule of DLL */
* The maximum length of a registry key is 255 characters.
* http://msdn.microsoft.com/en-us/library/ms724872(v=vs.85).aspx
*/
-char event_source[256] = "PostgreSQL";
+char event_source[256] = DEFAULT_EVENT_SOURCE;
/* Prototypes */
HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h
index d1f99fbafe..16f7ef9bea 100644
--- a/src/include/pg_config_manual.h
+++ b/src/include/pg_config_manual.h
@@ -154,6 +154,11 @@
*/
#define DEFAULT_PGSOCKET_DIR "/tmp"
+/*
+ * This is the default event source for Windows event log.
+ */
+#define DEFAULT_EVENT_SOURCE "PostgreSQL"
+
/*
* The random() function is expected to yield values between 0 and
* MAX_RANDOM_VALUE. Currently, all known implementations yield