/* pg_logger: stdin-to-syslog gateway for postgresql. * * Copyright 2001 by Nathan Myers * 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 #include #include #include 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; }