mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Add:
#log_line_prefix = '' # e.g. '<%u%%%d> ' # %u=user name %d=database name # %r=remote host and port # %p=PID %t=timestamp %i=command tag # %c=session id %l=session line number # %s=session start timestamp # %x=stop here in non-session processes # %%='%' Andrew Dunstan
This commit is contained in:
@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.126 2003/11/29 19:52:01 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.127 2004/03/09 04:43:07 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -72,6 +72,7 @@ PGErrorVerbosity Log_error_verbosity = PGERROR_VERBOSE;
|
||||
bool Log_timestamp = false; /* show timestamps in stderr
|
||||
* output */
|
||||
bool Log_pid = false; /* show PIDs in stderr output */
|
||||
char *Log_line_prefix = ""; /* format for extra log line info */
|
||||
|
||||
#ifdef HAVE_SYSLOG
|
||||
/*
|
||||
@ -146,7 +147,7 @@ static const char *error_severity(int elevel);
|
||||
static const char *print_timestamp(void);
|
||||
static const char *print_pid(void);
|
||||
static void append_with_tabs(StringInfo buf, const char *str);
|
||||
|
||||
static const char *log_line_prefix(void);
|
||||
|
||||
/*
|
||||
* errstart --- begin an error-reporting cycle
|
||||
@ -1022,6 +1023,138 @@ write_syslog(int level, const char *line)
|
||||
}
|
||||
#endif /* HAVE_SYSLOG */
|
||||
|
||||
/*
|
||||
* Format tag info for log lines
|
||||
*/
|
||||
static const char *
|
||||
log_line_prefix(void)
|
||||
{
|
||||
|
||||
/* static accumulator for line numbers */
|
||||
static int log_line_number = 0;
|
||||
|
||||
/* space for option string + one of each option, plus some room to spare */
|
||||
/* Note: if more identifiers are built in this will have to increase */
|
||||
static char *result = NULL;
|
||||
int format_len = strlen(Log_line_prefix);
|
||||
int result_len = 2*NAMEDATALEN + format_len +120 ;
|
||||
|
||||
if (result == NULL)
|
||||
result = malloc(result_len);
|
||||
result[0] = '\0';
|
||||
|
||||
if (format_len > 0)
|
||||
{
|
||||
int i,j;
|
||||
char * dbname = NULL;
|
||||
char * username = NULL;
|
||||
time_t stamp_time;
|
||||
log_line_number++;
|
||||
if (MyProcPort != NULL)
|
||||
{
|
||||
dbname = MyProcPort->database_name;
|
||||
username = MyProcPort->user_name;
|
||||
if (dbname == NULL || *dbname == '\0')
|
||||
dbname = gettext("[unknown]");
|
||||
if (username == NULL || *username == '\0')
|
||||
username = gettext("[unknown]");
|
||||
}
|
||||
|
||||
/*
|
||||
* invariant through each iteration of this loop:
|
||||
* . j is the index of the trailing null on result
|
||||
* . result_len - j is the number of chars we have room for
|
||||
* including the trailing null
|
||||
* . there is room to write at least one more non-null char plus the
|
||||
* trailing null
|
||||
*/
|
||||
for (i = 0, j=0; i < format_len && j < result_len-1; i++)
|
||||
{
|
||||
if(Log_line_prefix[i] != '%')
|
||||
{
|
||||
/* literal char, just copy */
|
||||
result[j]=Log_line_prefix[i];
|
||||
j++;
|
||||
result[j] = '\0';
|
||||
continue;
|
||||
}
|
||||
else if (i == format_len - 1)
|
||||
{
|
||||
/* format error - skip it */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* go to char after '%' */
|
||||
i++;
|
||||
|
||||
/* in postmaster and friends, skip non-applicable options,
|
||||
* stop if %x is seen
|
||||
*/
|
||||
if (MyProcPort == NULL)
|
||||
{
|
||||
if (Log_line_prefix[i] == 'x')
|
||||
break;
|
||||
if (strchr("udcsir",Log_line_prefix[i]) != NULL)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* process the option */
|
||||
switch (Log_line_prefix[i])
|
||||
{
|
||||
case 'u':
|
||||
j += snprintf(result+j,result_len-j,"%s",username);
|
||||
break;
|
||||
case 'd':
|
||||
j += snprintf(result+j,result_len-j,"%s",dbname);
|
||||
break;
|
||||
case 'c':
|
||||
j += snprintf(result+j,result_len-j,"%lx.%lx",
|
||||
(long)(MyProcPort->session_start.tv_sec),
|
||||
(long)MyProcPid);
|
||||
break;
|
||||
case 'p':
|
||||
j += snprintf(result+j,result_len-j,"%ld",(long)MyProcPid);
|
||||
break;
|
||||
case 'l':
|
||||
j += snprintf(result+j,result_len-j,"%d",log_line_number);
|
||||
break;
|
||||
case 't':
|
||||
stamp_time = time(NULL);
|
||||
j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
|
||||
localtime(&stamp_time));
|
||||
break;
|
||||
case 's':
|
||||
j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
|
||||
localtime(&(MyProcPort->session_start.tv_sec)));
|
||||
break;
|
||||
case 'i':
|
||||
j += snprintf(result+j,result_len-j,"%s",
|
||||
MyProcPort->commandTag);
|
||||
break;
|
||||
case 'r':
|
||||
j += snprintf(result+j,result_len-j,"%s",
|
||||
MyProcPort->remote_host);
|
||||
if (!LogSourcePort && strlen(MyProcPort->remote_port))
|
||||
j += snprintf(result+j,result_len-j,"(%s)",
|
||||
MyProcPort->remote_port);
|
||||
break;
|
||||
case 'x':
|
||||
/* non-postmaster case - just ignore */
|
||||
break;
|
||||
case '%':
|
||||
result[j] = '%';
|
||||
j++;
|
||||
result[j] = '\0';
|
||||
break;
|
||||
default:
|
||||
/* format error - skip it */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Write error report to server's log
|
||||
@ -1033,7 +1166,8 @@ send_message_to_server_log(ErrorData *edata)
|
||||
|
||||
initStringInfo(&buf);
|
||||
|
||||
appendStringInfo(&buf, "%s: ", error_severity(edata->elevel));
|
||||
appendStringInfo(&buf, "%s%s: ",
|
||||
log_line_prefix(), error_severity(edata->elevel));
|
||||
|
||||
if (Log_error_verbosity >= PGERROR_VERBOSE)
|
||||
{
|
||||
@ -1066,18 +1200,21 @@ send_message_to_server_log(ErrorData *edata)
|
||||
{
|
||||
if (edata->detail)
|
||||
{
|
||||
appendStringInfoString(&buf, log_line_prefix() );
|
||||
appendStringInfoString(&buf, gettext("DETAIL: "));
|
||||
append_with_tabs(&buf, edata->detail);
|
||||
appendStringInfoChar(&buf, '\n');
|
||||
}
|
||||
if (edata->hint)
|
||||
{
|
||||
appendStringInfoString(&buf, log_line_prefix() );
|
||||
appendStringInfoString(&buf, gettext("HINT: "));
|
||||
append_with_tabs(&buf, edata->hint);
|
||||
appendStringInfoChar(&buf, '\n');
|
||||
}
|
||||
if (edata->context)
|
||||
{
|
||||
appendStringInfoString(&buf, log_line_prefix() );
|
||||
appendStringInfoString(&buf, gettext("CONTEXT: "));
|
||||
append_with_tabs(&buf, edata->context);
|
||||
appendStringInfoChar(&buf, '\n');
|
||||
@ -1086,11 +1223,13 @@ send_message_to_server_log(ErrorData *edata)
|
||||
{
|
||||
/* assume no newlines in funcname or filename... */
|
||||
if (edata->funcname && edata->filename)
|
||||
appendStringInfo(&buf, gettext("LOCATION: %s, %s:%d\n"),
|
||||
appendStringInfo(&buf, gettext("%sLOCATION: %s, %s:%d\n"),
|
||||
log_line_prefix(),
|
||||
edata->funcname, edata->filename,
|
||||
edata->lineno);
|
||||
else if (edata->filename)
|
||||
appendStringInfo(&buf, gettext("LOCATION: %s:%d\n"),
|
||||
appendStringInfo(&buf, gettext("%sLOCATION: %s:%d\n"),
|
||||
log_line_prefix(),
|
||||
edata->filename, edata->lineno);
|
||||
}
|
||||
}
|
||||
@ -1100,6 +1239,7 @@ send_message_to_server_log(ErrorData *edata)
|
||||
*/
|
||||
if (edata->elevel >= log_min_error_statement && debug_query_string != NULL)
|
||||
{
|
||||
appendStringInfoString(&buf, log_line_prefix() );
|
||||
appendStringInfoString(&buf, gettext("STATEMENT: "));
|
||||
append_with_tabs(&buf, debug_query_string);
|
||||
appendStringInfoChar(&buf, '\n');
|
||||
|
Reference in New Issue
Block a user