From: Marko Kreen Date: Mon, 11 Jan 2010 05:44:16 +0000 (+0200) Subject: X-Git-Tag: pgbouncer_1_4_rc3~79 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60a9f66b4240b69771a3032bbb31d4dfb5bb8277;p=pgbouncer --- diff --git a/include/bouncer.h b/include/bouncer.h index c23098f..86686a9 100644 --- a/include/bouncer.h +++ b/include/bouncer.h @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -305,9 +306,7 @@ struct PgSocket { #define tmp_login_salt cancel_key /* main.c */ -extern int cf_verbose; extern int cf_daemon; -extern int cf_quiet; extern char *cf_config_file; extern char *cf_jobname; @@ -345,7 +344,6 @@ extern int cf_server_round_robin; extern int cf_auth_type; extern char *cf_auth_file; -extern char *cf_logfile; extern char *cf_pidfile; extern char *cf_ignore_startup_params; diff --git a/include/system.h b/include/system.h index 5adfe9b..beb7d0f 100644 --- a/include/system.h +++ b/include/system.h @@ -72,19 +72,6 @@ #define FLEX_ARRAY 1 #endif -/* cant use assert() as we want to log too */ -#ifdef CASSERT -#define Assert(e) \ -do { \ - if (unlikely(!(e))) { \ - fatal_noexit("Assert(%s) failed", #e); \ - abort(); \ - } \ -} while (0) -#else -#define Assert(e) -#endif - #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 128 /* actual sizeof() will be applied later anyway */ #endif diff --git a/include/util.h b/include/util.h index 0c242bd..7f5f835 100644 --- a/include/util.h +++ b/include/util.h @@ -21,52 +21,23 @@ */ char *load_file(const char *fn) _MUSTCHECK; -/* - * generic logging - */ -void log_level(const char *level, const char *s, ...) _PRINTF(2, 3); -#define log_error(args...) log_level("ERROR", ## args) -#define log_warning(args...) log_level("WARNING", ## args) -#define log_info(args...) log_level("LOG", ## args) -#define log_debug(args...) do { \ - if (unlikely(cf_verbose > 0)) \ - log_level("DEBUG", ## args); \ - } while (0) -#define log_noise(args...) do { \ - if (unlikely(cf_verbose > 1)) \ - log_level("NOISE", ## args); \ - } while (0) - -void close_logfile(void); - /* * logging about specific socket */ -void slog_level(const char *level, const PgSocket *sock, const char *fmt, ...) _PRINTF(3, 4); -#define slog_error(sk, args...) slog_level("ERROR", sk, ## args) -#define slog_warning(sk, args...) slog_level("WARNING", sk, ## args) -#define slog_info(sk, args...) slog_level("LOG", sk, ## args) +int log_socket_prefix(enum LogLevel lev, void *ctx, char *dst, unsigned int dstlen); + +#define slog_error(sk, args...) log_generic(LG_ERROR, sk, ## args) +#define slog_warning(sk, args...) log_generic(LG_WARNING, sk, ## args) +#define slog_info(sk, args...) log_generic(LG_INFO, sk, ## args) #define slog_debug(sk, args...) do { \ if (unlikely(cf_verbose > 0)) \ - slog_level("DEBUG", sk, ## args); \ + log_generic(LG_DEBUG, sk, ## args); \ } while (0) #define slog_noise(sk, args...) do { \ if (unlikely(cf_verbose > 1)) \ - slog_level("NOISE", sk, ## args); \ + log_generic(LG_NOISE, sk, ## args); \ } while (0) -/* - * log and exit - */ -void _fatal(const char *file, int line, const char *func, bool do_exit, const char *s, ...) _PRINTF(5, 6); -void _fatal_perror(const char *file, int line, const char *func, const char *s, ...) _PRINTF(4, 5); -#define fatal(args...) \ - _fatal(__FILE__, __LINE__, __func__, true, ## args) -#define fatal_noexit(args...) \ - _fatal(__FILE__, __LINE__, __func__, false, ## args) -#define fatal_perror(args...) \ - _fatal_perror(__FILE__, __LINE__, __func__, ## args) - /* * non-interruptible operations */ diff --git a/src/main.c b/src/main.c index 4cf7bc9..5553e00 100644 --- a/src/main.c +++ b/src/main.c @@ -51,8 +51,6 @@ static void usage(int err, char *exe) * configuration storage */ -int cf_quiet = 0; /* if set, no log is printed to stdout/err */ -int cf_verbose = 0; int cf_daemon = 0; int cf_pause_mode = P_NONE; int cf_shutdown = 0; /* 1 - wait for queries to finish, 2 - shutdown immediately */ @@ -118,7 +116,6 @@ usec_t cf_suspend_timeout = 10*USEC; usec_t g_suspend_start = 0; -char *cf_logfile = ""; char *cf_pidfile = ""; char *cf_jobname = "pgbouncer"; @@ -309,7 +306,7 @@ void load_config(bool reload) /* reopen logfile */ if (reload) - close_logfile(); + reset_logging(); } /* @@ -686,6 +683,7 @@ int main(int argc, char *argv[]) init_objects(); load_config(false); init_caches(); + logging_prefix_cb = log_socket_prefix; /* prefer cmdline over config for username */ if (arg_username) diff --git a/src/util.c b/src/util.c index 75b6d11..8f1a0f0 100644 --- a/src/util.c +++ b/src/util.c @@ -22,188 +22,19 @@ #include "bouncer.h" -#ifndef WIN32 -#include -#endif - #include "md5.h" -static int syslog_started = 0; -static int log_fd = 0; - -struct FacName { const char *name; int code; }; -static struct FacName facility_names [] = { - { "auth", LOG_AUTH }, -#ifdef LOG_AUTHPRIV - { "authpriv", LOG_AUTHPRIV }, -#endif - { "daemon", LOG_DAEMON }, - { "user", LOG_USER }, - { "local0", LOG_LOCAL0 }, - { "local1", LOG_LOCAL1 }, - { "local2", LOG_LOCAL2 }, - { "local3", LOG_LOCAL3 }, - { "local4", LOG_LOCAL4 }, - { "local5", LOG_LOCAL5 }, - { "local6", LOG_LOCAL6 }, - { "local7", LOG_LOCAL7 }, - { NULL }, -}; - - -/* - * Generic logging - */ - -static void close_syslog(void) -{ - if (syslog_started) { - closelog(); - syslog_started = 0; - } -} - -static void init_syslog(void) -{ - struct FacName *fn; - int facility = LOG_DAEMON; - - for (fn = facility_names; fn->name; fn++) - if (strcmp(cf_syslog_facility, fn->name) == 0) { - facility = fn->code; - break; - } - - openlog(cf_jobname, LOG_PID, facility); - syslog_started = 1; -} - -static void write_syslog(const char *pfx, const char *msg) -{ - int prio = LOG_WARNING; - - if (!syslog_started) - init_syslog(); - - switch (pfx[0]) { - case 'F': prio = LOG_CRIT; break; - case 'E': prio = LOG_ERR; break; - case 'W': prio = LOG_WARNING; break; - case 'I': prio = LOG_INFO; break; - case 'L': prio = LOG_INFO; break; - case 'D': prio = LOG_DEBUG; break; - case 'N': prio = LOG_DEBUG; break; - } - - syslog(prio, "%s", msg); -} - -void close_logfile(void) -{ - if (log_fd > 0) { - close(log_fd); - log_fd = 0; - } - close_syslog(); -} - -static void write_logfile(const char *buf, int len) -{ - int res; - if (!log_fd) { - int fd = open(cf_logfile, O_CREAT | O_APPEND | O_WRONLY, 0644); - if (fd < 0) - return; - log_fd = fd; - } - res = safe_write(log_fd, buf, len); - if (res < len) - /* nothing to do here */ - len = 0; -} - -static void _log_write(const char *pfx, const char *msg) -{ - char buf[1024]; - char tbuf[64]; - int len; - int old_errno = errno; - - format_time_ms(0, tbuf, sizeof(tbuf)); - len = snprintf(buf, sizeof(buf), "%s %u %s %s\n", - tbuf, (unsigned)getpid(), pfx, msg); - - if (cf_logfile[0]) - write_logfile(buf, len); - - if (cf_syslog) - write_syslog(pfx, msg); - - if (!cf_quiet) - fprintf(stderr, "%s", buf); - - if (old_errno != errno) - errno = old_errno; -} - -static void _log(const char *pfx, const char *fmt, va_list ap) -{ - char buf[1024]; - vsnprintf(buf, sizeof(buf), fmt, ap); - _log_write(pfx, buf); -} - -void _fatal(const char *file, int line, const char *func, - bool do_exit, const char *fmt, ...) -{ - va_list ap; - char buf[1024]; - - snprintf(buf, sizeof(buf), - "@%s:%d in function %s(): %s", - file, line, func, fmt); - - va_start(ap, fmt); - _log("FATAL", buf, ap); - va_end(ap); - if (do_exit) - exit(1); -} - -void _fatal_perror(const char *file, int line, const char *func, - const char *fmt, ...) -{ - va_list ap; - char buf[1024]; - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - _fatal(file, line, func, true, "%s: %s", buf, strerror(errno)); -} - -/* - * generic logging - */ -void log_level(const char *pfx, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - _log(pfx, fmt, ap); - va_end(ap); -} - -/* - * Logging about specific PgSocket - */ - -void slog_level(const char *pfx, const PgSocket *sock, const char *fmt, ...) +int log_socket_prefix(enum LogLevel lev, void *ctx, char *dst, unsigned int dstlen) { - char buf1[1024]; - char buf2[1024]; + const struct PgSocket *sock = ctx; char *user, *db, *host; int port; - va_list ap; + /* no prefix */ + if (!sock) + return 0; + + /* format prefix */ db = sock->pool ? sock->pool->db->name : "(nodb)"; user = sock->auth_user ? sock->auth_user->name : "(nouser)"; if (sock->remote_addr.is_unix) { @@ -213,15 +44,9 @@ void slog_level(const char *pfx, const PgSocket *sock, const char *fmt, ...) } port = sock->remote_addr.port; - va_start(ap, fmt); - vsnprintf(buf1, sizeof(buf1), fmt, ap); - va_end(ap); - - snprintf(buf2, sizeof(buf2), "%c-%p: %s/%s@%s:%d %s", + return snprintf(dst, dstlen, "%c-%p: %s/%s@%s:%d ", is_server_socket(sock) ? 'S' : 'C', - sock, db, user, host, port, buf1); - - _log_write(pfx, buf2); + sock, db, user, host, port); }