From c0e4520b1667279389bb0dce8d867df2ac25042a Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Thu, 17 Jul 2014 12:42:08 +0200 Subject: [PATCH] Add option to pg_ctl to choose event source for logging pg_ctl will log to the Windows event log when it is running as a service, which is the primary way of running PostgreSQL on Windows. This option makes it possible to specify which event source to use for this, in order to separate different instances. The server logging itself is still controlled by the regular logging parameters, including a separate setting for the event source. The parameter to pg_ctl only controlls the logging from pg_ctl itself. MauMau, review in many iterations by Amit Kapila and me. --- doc/src/sgml/ref/pg_ctl-ref.sgml | 16 ++++++++++++++++ src/backend/utils/error/elog.c | 3 ++- src/backend/utils/misc/guc.c | 2 +- src/bin/pg_ctl/pg_ctl.c | 16 ++++++++++++++-- src/bin/pgevent/pgevent.c | 2 +- src/include/pg_config_manual.h | 5 +++++ 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml index 52bcf5e8153..23681294b87 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 0d92dcd036c..32a9663366d 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 3a31a751919..6c52db85903 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 9a6ade935f8..edd202b7d7f 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 6a667812fba..83949c2cda2 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 d1f99fbafef..16f7ef9bea6 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