The optional file data/pg_options
contains runtime options used by the backend to control trace
messages and other backend tunable parameters. What makes this file
interesting is the fact that it is re-read by a backend when it
receives a SIGHUP signal, making thus possible to change run-time
options on the fly without needing to restart Postgres. The options specified in this file
may be debugging flags used by the trace package (backend/utils/misc/trace.c) or numeric parameters
which can be used by the backend to control its behaviour. New
options and parameters must be defined in backend/utils/misc/trace.c and backend/include/utils/trace.h.

For example suppose we want to add conditional trace messages
and a tunable numeric parameter to the code in file foo.c. All we need to do is to add the constant
TRACE_FOO and OPT_FOO_PARAM into backend/include/utils/trace.h:

All pg_options are initialized to zero at backend startup. If we
need a different default value we must add some initialization code
at the beginning of PostgresMain. Now we
can set the foo_param and enable foo trace by writing values into
the data/pg_options file:

# file pg_options
...
foo=1
fooparam=17

The new options will be read by all new backends when they are
started. To make effective the changes for all running backends we
need to send a SIGHUP to the postmaster. The signal will be
automatically sent to all the backends. We can also activate the
changes only for a specific backend by sending the SIGHUP directly
to it.

pg_options can also be specified with the -T switch of Postgres:

postgres options -T "verbose=2,query,hostlookup-"

The functions used for printing errors and debug messages can
now make use of the syslog(2) facility.
Message printed to stdout or stderr are prefixed by a timestamp
containing also the backend pid:

This format improves readability of the logs and allows people
to understand exactly which backend is doing what and at which
time. It also makes easier to write simple awk or perl scripts
which monitor the log to detect database errors or problem, or to
compute transaction time statistics.

Messages printed to syslog use the log facility LOG_LOCAL0. The
use of syslog can be controlled with the syslog pg_option.
Unfortunately many functions call directly printf() to print their messages to stdout or
stderr and this output can't be redirected to syslog or have
timestamps in it. It would be advisable that all calls to printf
would be replaced with the PRINTF macro and output to stderr be
changed to use EPRINTF instead so that we can control all output in
a uniform way.

The new pg_options mechanism is more convenient than defining
new backend option switches because:

we don't have to define a different switch for each thing we
want to control. All options are defined as keywords in an
external file stored in the data directory.

we don't have to restart Postgres to change the setting of some
option. Normally backend options are specified to the
postmaster and passed to each backend when it is started. Now
they are read from a file.

we can change options on the fly while a backend is running.
We can thus investigate some problem by activating debug
messages only when the problem appears. We can also try
different values for tunable parameters.

Note that keyword can also be
an abbreviation of the option name defined in backend/utils/misc/trace.c.

Refer to The Administrator's Guide
chapter on runtime options for a complete list of currently
supported options.

Some of the existing code using private variables and option
switches has been changed to make use of the pg_options feature,
mainly in postgres.c. It would be
advisable to modify all existing code in this way, so that we can
get rid of many of the switches on the Postgres command line and can have more
tunable options with a unique place to put option values.