mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
Fix too long syslog message problem
This commit is contained in:
parent
8bba4b4e0e
commit
23b0387a94
@ -24,6 +24,12 @@
|
||||
#include "miscadmin.h"
|
||||
#include "utils/trace.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef MULTIBYTE
|
||||
#include "mb/pg_wchar.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We could support trace messages of indefinite length, as elog() does,
|
||||
* but it's probably not worth the trouble. Instead limit trace message
|
||||
@ -204,16 +210,90 @@ eprintf(const char *fmt,...)
|
||||
void
|
||||
write_syslog(int level, char *line)
|
||||
{
|
||||
#ifndef PG_SYSLOG_LIMIT
|
||||
#define PG_SYSLOG_LIMIT 128
|
||||
#endif /* PG_SYSLOG_LIMIT */
|
||||
|
||||
static int openlog_done = 0;
|
||||
static char buf[PG_SYSLOG_LIMIT+1];
|
||||
static int logid = 0;
|
||||
|
||||
if (UseSyslog >= 1)
|
||||
{
|
||||
int len = strlen(line);
|
||||
int buflen;
|
||||
int seq = 0;
|
||||
int l;
|
||||
int i;
|
||||
|
||||
if (!openlog_done)
|
||||
{
|
||||
openlog_done = 1;
|
||||
openlog(PG_LOG_IDENT, LOG_PID | LOG_NDELAY, PG_LOG_FACILITY);
|
||||
}
|
||||
syslog(level, "%s", line);
|
||||
|
||||
/* divide into multiple syslog() calls if message is
|
||||
* too long
|
||||
*/
|
||||
if (len > PG_SYSLOG_LIMIT)
|
||||
{
|
||||
logid++;
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
strncpy(buf, line, PG_SYSLOG_LIMIT);
|
||||
buf[PG_SYSLOG_LIMIT] = '\0';
|
||||
|
||||
l = strlen(buf);
|
||||
#ifdef MULTIBYTE
|
||||
/* trim to multibyte letter boundary */
|
||||
buflen = pg_mbcliplen(buf, l, l);
|
||||
buf[buflen] = '\0';
|
||||
l = strlen(buf);
|
||||
#endif
|
||||
/* already word boundary? */
|
||||
if (isspace(line[l]) || line[l] == '\0')
|
||||
{
|
||||
buflen = l;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* try to divide in word boundary */
|
||||
i = l - 1;
|
||||
while(i > 0 && !isspace(buf[i]))
|
||||
{
|
||||
i--;
|
||||
}
|
||||
if (i <= 0) /* couldn't divide word boundary */
|
||||
{
|
||||
buflen = l;
|
||||
}
|
||||
else
|
||||
{
|
||||
buflen = i;
|
||||
buf[i] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
seq++;
|
||||
/*
|
||||
* Here we actually call syslog().
|
||||
* For segmented messages, we add logid
|
||||
* (incremented at each write_syslog call),
|
||||
* and seq (incremented at each syslog call
|
||||
* within a write_syslog call).
|
||||
* This will prevent syslog to surpress
|
||||
* "same" messages...
|
||||
*/
|
||||
syslog(level, "[%d-%d] %s", logid, seq, buf);
|
||||
line += buflen;
|
||||
len -= buflen;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
syslog(level, "%s", line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user