The backend type, which corresponds to what
pg_stat_activity.backend_type shows, is added as a column to the
csvlog and can optionally be added to log_line_prefix using the new %b
placeholder.
Reviewed-by: Julien Rouhaud <rjuju123@gmail.com>
Reviewed-by: Kuntal Ghosh <kuntalghosh.2007@gmail.com>
Reviewed-by: Alvaro Herrera <alvherre@2ndquadrant.com>
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>
Discussion: https://www.postgresql.org/message-id/flat/
c65e5196-4f04-4ead-9353-
6088c19615a3@2ndquadrant.com
index 371d7838fb6473e87755633729e7843dfc5a8ed5..3cac340f3237f2358c6ca503945a56ad8ecc792d 100644 (file)
right with spaces to give it a minimum width, whereas a positive
value will pad on the left. Padding can be useful to aid human
readability in log files.
+ </para>
+
+ <para>
This parameter can only be set in the <filename>postgresql.conf</filename>
file or on the server command line. The default is
<literal>'%m [%p] '</literal> which logs a time stamp and the process ID.
+ </para>
<informaltable>
<tgroup cols="3">
<entry>Remote host name or IP address</entry>
<entry>yes</entry>
</row>
+ <row>
+ <entry><literal>%b</literal></entry>
+ <entry>Backend type</entry>
+ <entry>no</entry>
+ </row>
<row>
<entry><literal>%p</literal></entry>
<entry>Process ID</entry>
</tgroup>
</informaltable>
+ <para>
+ The backend type corresponds to the column
+ <structfield>backend_type</structfield> in the view <xref
+ linkend="pg-stat-activity-view"/>, but additional types can appear
+ in the log that don't show in that view.
+ </para>
+
+ <para>
The <literal>%c</literal> escape prints a quasi-unique session identifier,
consisting of two 4-byte hexadecimal numbers (without leading zeros)
separated by a dot. The numbers are the process start time and the
character count of the error position therein,
location of the error in the PostgreSQL source code
(if <varname>log_error_verbosity</varname> is set to <literal>verbose</literal>),
- and application name.
+ application name, and backend type.
Here is a sample table definition for storing CSV-format log output:
<programlisting>
query_pos integer,
location text,
application_name text,
+ backend_type text,
PRIMARY KEY (session_id, session_line_num)
);
</programlisting>
index f8ae94729cce335276d5b7c5eb91ec854c6080f2..62eef7b71f463fb60b31c15e79be264fea8a5fba 100644 (file)
#include "libpq/pqformat.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
+#include "postmaster/bgworker.h"
#include "postmaster/postmaster.h"
#include "postmaster/syslogger.h"
#include "storage/ipc.h"
padding > 0 ? padding : -padding);
break;
+ case 'b':
+ {
+ const char *backend_type_str;
+
+ if (MyProcPid == PostmasterPid)
+ backend_type_str = "postmaster";
+ else if (MyBackendType == B_BG_WORKER)
+ backend_type_str = MyBgworkerEntry->bgw_type;
+ else
+ backend_type_str = GetBackendTypeDesc(MyBackendType);
+
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, backend_type_str);
+ else
+ appendStringInfoString(buf, backend_type_str);
+ break;
+ }
case 'u':
if (MyProcPort)
{
if (application_name)
appendCSVLiteral(&buf, application_name);
+ appendStringInfoChar(&buf, ',');
+
+ /* backend type */
+ if (MyProcPid == PostmasterPid)
+ appendCSVLiteral(&buf, "postmaster");
+ else if (MyBackendType == B_BG_WORKER)
+ appendCSVLiteral(&buf, MyBgworkerEntry->bgw_type);
+ else
+ appendCSVLiteral(&buf, GetBackendTypeDesc(MyBackendType));
+
appendStringInfoChar(&buf, '\n');
/* If in the syslogger process, try to write messages direct to file */
index e58e4788a8efb181b9e8a55e3d4db9f6e9c7749d..aa44f0c9bf25595d4b8c3325a573944644016b42 100644 (file)
# %d = database name
# %r = remote host and port
# %h = remote host
+ # %b = backend type
# %p = process ID
# %t = timestamp without milliseconds
# %m = timestamp with milliseconds
index a53e4a6243b52cf796e6babc9ba279549d5456de..f6a5e1b9c7661e0e033524d89d6c2f2c5bc27674 100644 (file)
@@ -2334,7 +2334,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
fputs("\n# Configuration added by pg_regress\n\n", pg_conf);
fputs("log_autovacuum_min_duration = 0\n", pg_conf);
fputs("log_checkpoints = on\n", pg_conf);
- fputs("log_line_prefix = '%m [%p] %q%a '\n", pg_conf);
+ fputs("log_line_prefix = '%m %b[%p] %q%a '\n", pg_conf);
fputs("log_lock_waits = on\n", pg_conf);
fputs("log_temp_files = 128kB\n", pg_conf);
fputs("max_prepared_transactions = 2\n", pg_conf);