Export log_line_prefix(); useful for emit_log_hook.
Patch attached. Some kinds of emit log hooks might find it useful to
also compute the log_line_prefix.
Regards,
Jeff Davis
Attachments:
0001-Export-log_line_prefix-useful-for-emit_log_hook.patchtext/x-patch; charset=UTF-8; name=0001-Export-log_line_prefix-useful-for-emit_log_hook.patchDownload
From c3d4f14602c043918b8b6dab88a976dac1923208 Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Tue, 28 Jun 2022 11:39:33 -0700
Subject: [PATCH] Export log_line_prefix(); useful for emit_log_hook.
---
src/backend/utils/error/elog.c | 3 +--
src/include/utils/elog.h | 3 +++
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 55ee5423afb..4cd6a713ebb 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -176,7 +176,6 @@ static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
static void write_console(const char *line, int len);
static const char *process_log_prefix_padding(const char *p, int *padding);
-static void log_line_prefix(StringInfo buf, ErrorData *edata);
static void send_message_to_server_log(ErrorData *edata);
static void send_message_to_frontend(ErrorData *edata);
static void append_with_tabs(StringInfo buf, const char *str);
@@ -2441,7 +2440,7 @@ process_log_prefix_padding(const char *p, int *ppadding)
/*
* Format tag info for log lines; append to the provided buffer.
*/
-static void
+void
log_line_prefix(StringInfo buf, ErrorData *edata)
{
/* static counter for line numbers */
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index f5c6cd904de..71aaf40614c 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -16,6 +16,8 @@
#include <setjmp.h>
+#include "lib/stringinfo.h"
+
/* Error level codes */
#define DEBUG5 10 /* Debugging messages, in categories of
* decreasing detail. */
@@ -439,6 +441,7 @@ extern PGDLLIMPORT bool syslog_split_messages;
#define LOG_DESTINATION_JSONLOG 16
/* Other exported functions */
+extern void log_line_prefix(StringInfo buf, ErrorData *edata);
extern void DebugFileOpen(void);
extern char *unpack_sql_state(int sql_state);
extern bool in_error_recursion_trouble(void);
--
2.17.1
On Tue, Jun 28, 2022 at 11:52:56AM -0700, Jeff Davis wrote:
Patch attached. Some kinds of emit log hooks might find it useful to
also compute the log_line_prefix.
Have you played with anything specific that would require that? I
am fine to expose this routine, being mostly curious about what kind
of recent format implemented with the elog hook would use it.
--
Michael
On Wed, 2022-06-29 at 10:17 +0900, Michael Paquier wrote:
On Tue, Jun 28, 2022 at 11:52:56AM -0700, Jeff Davis wrote:
Patch attached. Some kinds of emit log hooks might find it useful
to
also compute the log_line_prefix.Have you played with anything specific that would require that? I
am fine to expose this routine, being mostly curious about what kind
of recent format implemented with the elog hook would use it.
Just a slightly different format that is directly digestible by another
system, while still preserving what the original messages in the file
would look like.
There are other ways to do it, but it's convenient. If we use, e.g.,
csv or json format, we lose the log_line_prefix and would need to
regenerate it from the individual fields.
Regards,
Jeff Davis
On 2022-Jun-28, Jeff Davis wrote:
Patch attached. Some kinds of emit log hooks might find it useful to
also compute the log_line_prefix.
Hmm, maybe your hypothetical book would prefer to use a different
setting for log line prefix than Log_line_prefix, so it would make sense
to pass the format string as a parameter to the function instead of
relying on the GUC global.
--
Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/
"Java is clearly an example of money oriented programming" (A. Stepanov)
On Wed, Jun 29, 2022 at 03:09:42PM +0200, Alvaro Herrera wrote:
Hmm, maybe your hypothetical book would prefer to use a different
setting for log line prefix than Log_line_prefix, so it would make sense
to pass the format string as a parameter to the function instead of
relying on the GUC global.
+1.
--
Michael
On Mon, 2022-07-04 at 15:54 +0900, Michael Paquier wrote:
On Wed, Jun 29, 2022 at 03:09:42PM +0200, Alvaro Herrera wrote:
Hmm, maybe your hypothetical book would prefer to use a different
setting for log line prefix than Log_line_prefix, so it would make
sense
to pass the format string as a parameter to the function instead of
relying on the GUC global.
That is nicer, attached.
I also renamed the function log_status_format(), and made
log_line_prefix() a thin wrapper over that. I think that's less
confusing.
Regards,
Jeff Davis
Attachments:
v2-0001-Provide-log_status_format-useful-for-an-emit_log_hoo.patchtext/x-patch; charset=UTF-8; name*0=v2-0001-Provide-log_status_format-useful-for-an-emit_log_hoo.patc; name*1=hDownload
From 4c64049e500c80ac495732d34ae56e07393115fe Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Tue, 28 Jun 2022 11:39:33 -0700
Subject: [PATCH] Provide log_status_format(), useful for an emit_log_hook.
Refactor so that log_line_prefix() is a thin wrapper over a new
function log_status_format(), and move the implementation to the
latter. Export log_status_format() so that it can be used by an
emit_log_hook.
---
src/backend/utils/error/elog.c | 15 ++++++++++++---
src/include/utils/elog.h | 3 +++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 55ee5423afb..7b2bb9c8b75 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -2439,10 +2439,19 @@ process_log_prefix_padding(const char *p, int *ppadding)
}
/*
- * Format tag info for log lines; append to the provided buffer.
+ * Format log status information using Log_line_prefix.
*/
static void
log_line_prefix(StringInfo buf, ErrorData *edata)
+{
+ log_status_format(buf, Log_line_prefix, edata);
+}
+
+/*
+ * Format log status info; append to the provided buffer.
+ */
+void
+log_status_format(StringInfo buf, char *format, ErrorData *edata)
{
/* static counter for line numbers */
static long log_line_number = 0;
@@ -2466,10 +2475,10 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
}
log_line_number++;
- if (Log_line_prefix == NULL)
+ if (format == NULL)
return; /* in case guc hasn't run yet */
- for (p = Log_line_prefix; *p != '\0'; p++)
+ for (p = format; *p != '\0'; p++)
{
if (*p != '%')
{
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index f5c6cd904de..e88e3f8a801 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -16,6 +16,8 @@
#include <setjmp.h>
+#include "lib/stringinfo.h"
+
/* Error level codes */
#define DEBUG5 10 /* Debugging messages, in categories of
* decreasing detail. */
@@ -439,6 +441,7 @@ extern PGDLLIMPORT bool syslog_split_messages;
#define LOG_DESTINATION_JSONLOG 16
/* Other exported functions */
+extern void log_status_format(StringInfo buf, char *format, ErrorData *edata);
extern void DebugFileOpen(void);
extern char *unpack_sql_state(int sql_state);
extern bool in_error_recursion_trouble(void);
--
2.17.1