]> granicus.if.org Git - pgbouncer/commitdiff
<usual/logging.h>
authorMarko Kreen <markokr@gmail.com>
Mon, 11 Jan 2010 05:44:16 +0000 (07:44 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 4 May 2010 11:30:49 +0000 (14:30 +0300)
include/bouncer.h
include/system.h
include/util.h
src/main.c
src/util.c

index c23098f573df5890a7be4b34df392395a53f9095..86686a9ebc7a866a2755fae531d4fd0a6fb82a4c 100644 (file)
@@ -26,6 +26,7 @@
 #include <usual/list.h>
 #include <usual/statlist.h>
 #include <usual/string.h>
+#include <usual/logging.h>
 
 #include <event.h>
 
@@ -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;
index 5adfe9b708428456d1e39528127fc4bc3f9e2862..beb7d0f9b850c6e0f652fcbe39ab2d5b01d978c3 100644 (file)
 #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
index 0c242bde798549e44a7499fa1667f6a80671a480..7f5f835d40c3738b5d75d8a7083df975ff733cb4 100644 (file)
  */
 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
  */
index 4cf7bc925920c278ad56562141713cbb6c04ffe6..5553e0011135f519f43c13d8458176d44ef49f1e 100644 (file)
@@ -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)
index 75b6d1139ff82ad9863751de4d7c812cf5e0dd82..8f1a0f0182efa724d47efca8f2f4aed37bfd3aea 100644 (file)
 
 #include "bouncer.h"
 
-#ifndef WIN32
-#include <syslog.h>
-#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);
 }