Commit c0e4520b authored by Magnus Hagander's avatar Magnus Hagander

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.
parent aa688725
...@@ -419,6 +419,22 @@ PostgreSQL documentation ...@@ -419,6 +419,22 @@ PostgreSQL documentation
<title>Options for Windows</title> <title>Options for Windows</title>
<variablelist> <variablelist>
<varlistentry>
<term><option>-e <replaceable class="parameter">source</replaceable></option></term>
<listitem>
<para>
Name of the event source for <application>pg_ctl</application> to use
for logging to the event log when running as a Windows service. The
default is <literal>PostgreSQL</literal>. Note that this only controls
the logging from <application>pg_ctl</application> itself - once
started, the server will use the event source specified
by <xref linkend="guc-event-source">. Should the server fail during
early startup, it may also log using the default event
source <literal>PostgreSQL</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-N <replaceable class="parameter">servicename</replaceable></option></term> <term><option>-N <replaceable class="parameter">servicename</replaceable></option></term>
<listitem> <listitem>
......
...@@ -1989,7 +1989,8 @@ write_eventlog(int level, const char *line, int len) ...@@ -1989,7 +1989,8 @@ write_eventlog(int level, const char *line, int len)
if (evtHandle == INVALID_HANDLE_VALUE) 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) if (evtHandle == NULL)
{ {
evtHandle = INVALID_HANDLE_VALUE; evtHandle = INVALID_HANDLE_VALUE;
......
...@@ -3019,7 +3019,7 @@ static struct config_string ConfigureNamesString[] = ...@@ -3019,7 +3019,7 @@ static struct config_string ConfigureNamesString[] =
NULL NULL
}, },
&event_source, &event_source,
"PostgreSQL", DEFAULT_EVENT_SOURCE,
NULL, NULL, NULL NULL, NULL, NULL
}, },
......
...@@ -89,6 +89,7 @@ static char *post_opts = NULL; ...@@ -89,6 +89,7 @@ static char *post_opts = NULL;
static const char *progname; static const char *progname;
static char *log_file = NULL; static char *log_file = NULL;
static char *exec_path = NULL; static char *exec_path = NULL;
static char *event_source = NULL;
static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */ static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
static char *register_username = NULL; static char *register_username = NULL;
static char *register_password = NULL; static char *register_password = NULL;
...@@ -178,7 +179,8 @@ write_eventlog(int level, const char *line) ...@@ -178,7 +179,8 @@ write_eventlog(int level, const char *line)
if (evtHandle == INVALID_HANDLE_VALUE) if (evtHandle == INVALID_HANDLE_VALUE)
{ {
evtHandle = RegisterEventSource(NULL, "PostgreSQL"); evtHandle = RegisterEventSource(NULL,
event_source ? event_source : DEFAULT_EVENT_SOURCE);
if (evtHandle == NULL) if (evtHandle == NULL)
{ {
evtHandle = INVALID_HANDLE_VALUE; evtHandle = INVALID_HANDLE_VALUE;
...@@ -1406,6 +1408,9 @@ pgwin32_CommandLine(bool registration) ...@@ -1406,6 +1408,9 @@ pgwin32_CommandLine(bool registration)
free(dataDir); free(dataDir);
} }
if (registration && event_source != NULL)
appendPQExpBuffer(cmdLine, " -e \"%s\"", event_source);
if (registration && do_wait) if (registration && do_wait)
appendPQExpBuffer(cmdLine, " -w"); appendPQExpBuffer(cmdLine, " -w");
...@@ -1878,6 +1883,10 @@ do_help(void) ...@@ -1878,6 +1883,10 @@ do_help(void)
printf(_("\nCommon options:\n")); printf(_("\nCommon options:\n"));
printf(_(" -D, --pgdata=DATADIR location of the database storage area\n")); printf(_(" -D, --pgdata=DATADIR location of the database storage area\n"));
printf(_(" -s, --silent only print errors, no informational messages\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(_(" -t, --timeout=SECS seconds to wait when using -w option\n"));
printf(_(" -V, --version output version information, then exit\n")); printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -w wait until operation completes\n")); printf(_(" -w wait until operation completes\n"));
...@@ -2140,7 +2149,7 @@ main(int argc, char **argv) ...@@ -2140,7 +2149,7 @@ main(int argc, char **argv)
/* process command-line options */ /* process command-line options */
while (optind < argc) 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) switch (c)
{ {
...@@ -2168,6 +2177,9 @@ main(int argc, char **argv) ...@@ -2168,6 +2177,9 @@ main(int argc, char **argv)
case 'm': case 'm':
set_mode(optarg); set_mode(optarg);
break; break;
case 'e':
event_source = pg_strdup(optarg);
break;
case 'N': case 'N':
register_servicename = pg_strdup(optarg); register_servicename = pg_strdup(optarg);
break; break;
......
...@@ -26,7 +26,7 @@ HANDLE g_module = NULL; /* hModule of DLL */ ...@@ -26,7 +26,7 @@ HANDLE g_module = NULL; /* hModule of DLL */
* The maximum length of a registry key is 255 characters. * The maximum length of a registry key is 255 characters.
* http://msdn.microsoft.com/en-us/library/ms724872(v=vs.85).aspx * 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 */ /* Prototypes */
HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine); HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
......
...@@ -154,6 +154,11 @@ ...@@ -154,6 +154,11 @@
*/ */
#define DEFAULT_PGSOCKET_DIR "/tmp" #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 * The random() function is expected to yield values between 0 and
* MAX_RANDOM_VALUE. Currently, all known implementations yield * MAX_RANDOM_VALUE. Currently, all known implementations yield
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment