0004-Add-local-address-to-log_line_prefix.patch
text/x-diff
Filename: 0004-Add-local-address-to-log_line_prefix.patch
Type: text/x-diff
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch 0004
| File | + | − |
|---|---|---|
| doc/src/sgml/config.sgml | 6 | 0 |
| src/backend/utils/error/elog.c | 33 | 0 |
| src/backend/utils/misc/postgresql.conf.sample | 1 | 0 |
| src/include/libpq/libpq-be.h | 3 | 0 |
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index fea683cb49c..a8542fe41ce 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -7689,6 +7689,12 @@ local0.* /var/log/postgresql
<entry>Remote host name or IP address</entry>
<entry>yes</entry>
</row>
+ <row>
+ <entry><literal>%L</literal></entry>
+ <entry>Local address (the IP address on the server that the
+ client connected to)</entry>
+ <entry>yes</entry>
+ </row>
<row>
<entry><literal>%b</literal></entry>
<entry>Backend type</entry>
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 8a6b6905079..d6299633ab7 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -67,6 +67,7 @@
#endif
#include "access/xact.h"
+#include "common/ip.h"
#include "libpq/libpq.h"
#include "libpq/pqformat.h"
#include "mb/pg_wchar.h"
@@ -3084,6 +3085,38 @@ log_status_format(StringInfo buf, const char *format, ErrorData *edata)
appendStringInfoSpaces(buf,
padding > 0 ? padding : -padding);
break;
+ case 'L':
+ {
+ const char *local_host;
+
+ if (MyProcPort)
+ {
+ if (MyProcPort->local_host[0] == '\0')
+ {
+ /*
+ * First time through: cache the lookup, since it
+ * might not have trivial cost.
+ */
+ (void) pg_getnameinfo_all(&MyProcPort->laddr.addr,
+ MyProcPort->laddr.salen,
+ MyProcPort->local_host,
+ sizeof(MyProcPort->local_host),
+ NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ }
+ local_host = MyProcPort->local_host;
+ }
+ else
+ {
+ /* Background process, or connection not yet made */
+ local_host = "[none]";
+ }
+ if (padding != 0)
+ appendStringInfo(buf, "%*s", padding, local_host);
+ else
+ appendStringInfoString(buf, local_host);
+ }
+ break;
case 'r':
if (MyProcPort && MyProcPort->remote_host)
{
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index ff56a1f0732..f154906c2fa 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -603,6 +603,7 @@
# %d = database name
# %r = remote host and port
# %h = remote host
+ # %L = local address
# %b = backend type
# %p = process ID
# %P = process ID of parallel group leader
diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h
index 0d1f1838f73..d6e671a6382 100644
--- a/src/include/libpq/libpq-be.h
+++ b/src/include/libpq/libpq-be.h
@@ -139,6 +139,9 @@ typedef struct Port
int remote_hostname_errcode; /* see above */
char *remote_port; /* text rep of remote port */
+ /* local_host is filled only if needed (see log_status_format) */
+ char local_host[64]; /* ip addr of local socket for client conn */
+
/*
* Information that needs to be saved from the startup packet and passed
* into backend execution. "char *" fields are NULL if not set.