Add backend type to csvlog and optionally log_line_prefix

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
This commit is contained in:
Peter Eisentraut 2020-03-15 11:20:21 +01:00
parent d8cfa82d51
commit 70a7b4776b
4 changed files with 49 additions and 2 deletions

View File

@ -6438,9 +6438,13 @@ local0.* /var/log/postgresql
right with spaces to give it a minimum width, whereas a positive 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 value will pad on the left. Padding can be useful to aid human
readability in log files. readability in log files.
</para>
<para>
This parameter can only be set in the <filename>postgresql.conf</filename> This parameter can only be set in the <filename>postgresql.conf</filename>
file or on the server command line. The default is file or on the server command line. The default is
<literal>'%m [%p] '</literal> which logs a time stamp and the process ID. <literal>'%m [%p] '</literal> which logs a time stamp and the process ID.
</para>
<informaltable> <informaltable>
<tgroup cols="3"> <tgroup cols="3">
@ -6477,6 +6481,11 @@ local0.* /var/log/postgresql
<entry>Remote host name or IP address</entry> <entry>Remote host name or IP address</entry>
<entry>yes</entry> <entry>yes</entry>
</row> </row>
<row>
<entry><literal>%b</literal></entry>
<entry>Backend type</entry>
<entry>no</entry>
</row>
<row> <row>
<entry><literal>%p</literal></entry> <entry><literal>%p</literal></entry>
<entry>Process ID</entry> <entry>Process ID</entry>
@ -6548,6 +6557,14 @@ local0.* /var/log/postgresql
</tgroup> </tgroup>
</informaltable> </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, The <literal>%c</literal> escape prints a quasi-unique session identifier,
consisting of two 4-byte hexadecimal numbers (without leading zeros) consisting of two 4-byte hexadecimal numbers (without leading zeros)
separated by a dot. The numbers are the process start time and the separated by a dot. The numbers are the process start time and the
@ -6772,7 +6789,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
character count of the error position therein, character count of the error position therein,
location of the error in the PostgreSQL source code location of the error in the PostgreSQL source code
(if <varname>log_error_verbosity</varname> is set to <literal>verbose</literal>), (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: Here is a sample table definition for storing CSV-format log output:
<programlisting> <programlisting>
@ -6801,6 +6818,7 @@ CREATE TABLE postgres_log
query_pos integer, query_pos integer,
location text, location text,
application_name text, application_name text,
backend_type text,
PRIMARY KEY (session_id, session_line_num) PRIMARY KEY (session_id, session_line_num)
); );
</programlisting> </programlisting>

View File

@ -72,6 +72,7 @@
#include "libpq/pqformat.h" #include "libpq/pqformat.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "postmaster/bgworker.h"
#include "postmaster/postmaster.h" #include "postmaster/postmaster.h"
#include "postmaster/syslogger.h" #include "postmaster/syslogger.h"
#include "storage/ipc.h" #include "storage/ipc.h"
@ -2492,6 +2493,23 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
padding > 0 ? padding : -padding); padding > 0 ? padding : -padding);
break; 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': case 'u':
if (MyProcPort) if (MyProcPort)
{ {
@ -2920,6 +2938,16 @@ write_csvlog(ErrorData *edata)
if (application_name) if (application_name)
appendCSVLiteral(&buf, 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'); appendStringInfoChar(&buf, '\n');
/* If in the syslogger process, try to write messages direct to file */ /* If in the syslogger process, try to write messages direct to file */

View File

@ -528,6 +528,7 @@
# %d = database name # %d = database name
# %r = remote host and port # %r = remote host and port
# %h = remote host # %h = remote host
# %b = backend type
# %p = process ID # %p = process ID
# %t = timestamp without milliseconds # %t = timestamp without milliseconds
# %m = timestamp with milliseconds # %m = timestamp with milliseconds

View 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("\n# Configuration added by pg_regress\n\n", pg_conf);
fputs("log_autovacuum_min_duration = 0\n", pg_conf); fputs("log_autovacuum_min_duration = 0\n", pg_conf);
fputs("log_checkpoints = on\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_lock_waits = on\n", pg_conf);
fputs("log_temp_files = 128kB\n", pg_conf); fputs("log_temp_files = 128kB\n", pg_conf);
fputs("max_prepared_transactions = 2\n", pg_conf); fputs("max_prepared_transactions = 2\n", pg_conf);