Commit 19dbc346 authored by Tom Lane's avatar Tom Lane

Add a hook for processing messages due to be sent to the server log.

Use-cases for this include custom log filtering rules and custom log
message transmission mechanisms (for instance, lossy log message
collection, which has been discussed several times recently).

As is our common practice for hooks, there's no regression test nor
user-facing documentation for this, though the author did exhibit a
sample module using the hook.

Martin Pihlak, reviewed by Marti Raudsepp
parent bc97c381
...@@ -95,6 +95,15 @@ sigjmp_buf *PG_exception_stack = NULL; ...@@ -95,6 +95,15 @@ sigjmp_buf *PG_exception_stack = NULL;
extern bool redirection_done; extern bool redirection_done;
/*
* Hook for intercepting messages before they are sent to the server log.
* Note that the hook will not get called for messages that are suppressed
* by log_min_messages. Also note that logging hooks implemented in preload
* libraries will miss any log messages that are generated before the
* library is loaded.
*/
emit_log_hook_type emit_log_hook = NULL;
/* GUC parameters */ /* GUC parameters */
int Log_error_verbosity = PGERROR_VERBOSE; int Log_error_verbosity = PGERROR_VERBOSE;
char *Log_line_prefix = NULL; /* format for extra log line info */ char *Log_line_prefix = NULL; /* format for extra log line info */
...@@ -1276,6 +1285,23 @@ EmitErrorReport(void) ...@@ -1276,6 +1285,23 @@ EmitErrorReport(void)
CHECK_STACK_DEPTH(); CHECK_STACK_DEPTH();
oldcontext = MemoryContextSwitchTo(ErrorContext); oldcontext = MemoryContextSwitchTo(ErrorContext);
/*
* Call hook before sending message to log. The hook function is allowed
* to turn off edata->output_to_server, so we must recheck that afterward.
* Making any other change in the content of edata is not considered
* supported.
*
* Note: the reason why the hook can only turn off output_to_server, and
* not turn it on, is that it'd be unreliable: we will never get here at
* all if errstart() deems the message uninteresting. A hook that could
* make decisions in that direction would have to hook into errstart(),
* where it would have much less information available. emit_log_hook is
* intended for custom log filtering and custom log message transmission
* mechanisms.
*/
if (edata->output_to_server && emit_log_hook)
(*emit_log_hook) (edata);
/* Send to server log, if enabled */ /* Send to server log, if enabled */
if (edata->output_to_server) if (edata->output_to_server)
send_message_to_server_log(edata); send_message_to_server_log(edata);
......
...@@ -334,6 +334,10 @@ extern void FlushErrorState(void); ...@@ -334,6 +334,10 @@ extern void FlushErrorState(void);
extern void ReThrowError(ErrorData *edata); extern void ReThrowError(ErrorData *edata);
extern void pg_re_throw(void) __attribute__((noreturn)); extern void pg_re_throw(void) __attribute__((noreturn));
/* Hook for intercepting messages before they are sent to the server log */
typedef void (*emit_log_hook_type) (ErrorData *edata);
extern PGDLLIMPORT emit_log_hook_type emit_log_hook;
/* GUC-configurable parameters */ /* GUC-configurable parameters */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment