mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
107 lines
1.9 KiB
C
107 lines
1.9 KiB
C
/* pg_logger: stdin-to-syslog gateway for postgresql.
|
|
*
|
|
* Copyright 2001 by Nathan Myers <ncm@nospam.cantrip.org>
|
|
* This software is distributed free of charge with no warranty of any kind.
|
|
* You have permission to make copies for any purpose, provided that (1)
|
|
* this copyright notice is retained unchanged, and (2) you agree to
|
|
* absolve the author of all responsibility for all consequences arising
|
|
* from any use.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stddef.h>
|
|
#include <syslog.h>
|
|
#include <string.h>
|
|
|
|
struct
|
|
{
|
|
const char *tag;
|
|
int size;
|
|
int priority;
|
|
} tags[] =
|
|
|
|
{
|
|
{
|
|
"", 0, LOG_NOTICE
|
|
},
|
|
{
|
|
"emerg:", sizeof("emerg"), LOG_EMERG
|
|
},
|
|
{
|
|
"alert:", sizeof("alert"), LOG_ALERT
|
|
},
|
|
{
|
|
"crit:", sizeof("crit"), LOG_CRIT
|
|
},
|
|
{
|
|
"err:", sizeof("err"), LOG_ERR
|
|
},
|
|
{
|
|
"error:", sizeof("error"), LOG_ERR
|
|
},
|
|
{
|
|
"warning:", sizeof("warning"), LOG_WARNING
|
|
},
|
|
{
|
|
"notice:", sizeof("notice"), LOG_NOTICE
|
|
},
|
|
{
|
|
"info:", sizeof("info"), LOG_INFO
|
|
},
|
|
{
|
|
"debug:", sizeof("debug"), LOG_DEBUG
|
|
}
|
|
};
|
|
|
|
int
|
|
main()
|
|
{
|
|
char buf[301];
|
|
int c;
|
|
char *pos = buf;
|
|
const char *colon = 0;
|
|
|
|
#ifndef DEBUG
|
|
openlog("postgresql", LOG_CONS, LOG_LOCAL1);
|
|
#endif
|
|
while ((c = getchar()) != EOF)
|
|
{
|
|
if (c == '\r')
|
|
continue;
|
|
if (c == '\n')
|
|
{
|
|
int level = sizeof(tags) / sizeof(*tags);
|
|
char *bol;
|
|
|
|
if (colon == 0 || (size_t) (colon - buf) > sizeof("warning"))
|
|
level = 1;
|
|
*pos = 0;
|
|
while (--level)
|
|
{
|
|
if (pos - buf >= tags[level].size
|
|
&& strncmp(buf, tags[level].tag, tags[level].size) == 0)
|
|
break;
|
|
}
|
|
bol = buf + tags[level].size;
|
|
if (bol > buf && *bol == ' ')
|
|
++bol;
|
|
if (pos - bol > 0)
|
|
{
|
|
#ifndef DEBUG
|
|
syslog(tags[level].priority, "%s", bol);
|
|
#else
|
|
printf("%d/%s\n", tags[level].priority, bol);
|
|
#endif
|
|
}
|
|
pos = buf;
|
|
colon = (char const *) 0;
|
|
continue;
|
|
}
|
|
if (c == ':' && !colon)
|
|
colon = pos;
|
|
if ((size_t) (pos - buf) < sizeof(buf) - 1)
|
|
*pos++ = c;
|
|
}
|
|
return 0;
|
|
}
|