Re: Syslog and pg_options (for RPMs)

From: ncm(at)zembu(dot)com (Nathan Myers)
To: pgsql-hackers(at)postgreSQL(dot)org
Subject: Re: Syslog and pg_options (for RPMs)
Date: 2001-02-10 03:12:17
Message-ID: 20010209191217.H624@store.zembu.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Here's the latest version of the pg_logger utility.
The particular questions that come to my mind are:

1. Do the prefixes it watches for match what PG produces?
2. Should it log to LOG_LOCAL1 or to some other LOG_LOCALn?
3. Is the ident string ("postgresql") right?
4. Are the openlog() args right? (E.g. should it ask for LOG_PID too?)
5. What am I failing to ask about?

I'd like to turn it over to whoever can answer those questions.

Nathan Myers
ncm(at)zembu(dot)com

-----------------
/* pg_logger: stdin-to-syslog gateway for postgresql.
*
* Copyright 2001 by Nathan Myers <ncm(at)nospam(dot)cantrip(dot)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 {
char *name;
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].name, 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;
}

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2001-02-10 03:19:36 Re: Syslog and pg_options (for RPMs)
Previous Message Bruce Momjian 2001-02-10 02:55:12 Link problems