]> granicus.if.org Git - pgbouncer/commitdiff
support sending log to syslog
authorMarko Kreen <markokr@gmail.com>
Thu, 6 Dec 2007 08:32:42 +0000 (08:32 +0000)
committerMarko Kreen <markokr@gmail.com>
Thu, 6 Dec 2007 08:32:42 +0000 (08:32 +0000)
doc/config.txt
include/bouncer.h
src/main.c
src/util.c

index a66db45ebee91bb93d058e6f5b4f14abec561a0e..c2069d0d5f71eb9b5b55b62bcbfef59a1712cda1 100644 (file)
@@ -140,6 +140,19 @@ Default: 0
 
 === Log settings ===
 
+==== syslog ====
+
+Toggles syslog on/off
+
+Default: 0
+
+==== syslog_facility ====
+
+Under what facility to send log to syslog.
+Possibilities: auth, authpriv, daemon, user, local0-7
+
+Default: daemon
+
 ==== log_connections ====
 
 Log successful logins.
index 0ecfea63ca30625610e1f5b0540c78c42bc74ca5..022098c0c4b6fedb72b163ce5a81b5a823c05e3a 100644 (file)
@@ -267,6 +267,10 @@ extern int cf_verbose;
 extern int cf_daemon;
 extern int cf_quiet;
 
+extern char *cf_jobname;
+extern int cf_syslog;
+extern char *cf_syslog_facility;
+
 extern char *cf_unix_socket_dir;
 extern char *cf_listen_addr;
 extern int cf_listen_port;
index ad3d67732468a4e12c7a062daf351cb3dce19473..00319a74c11fb4f103ae007b8853b92336ab1ad3 100644 (file)
@@ -51,6 +51,8 @@ int cf_daemon = 0;
 int cf_pause_mode = P_NONE;
 int cf_shutdown = 0;
 int cf_reboot = 0;
+int cf_syslog = 0;
+char *cf_syslog_facility = "daemon";
 static char *cf_config_file;
 
 char *cf_listen_addr = NULL;
@@ -93,7 +95,7 @@ usec_t cf_client_login_timeout = 60*USEC;
 
 char *cf_logfile = NULL;
 char *cf_pidfile = NULL;
-static char *cf_jobname = NULL;
+char *cf_jobname = "pgbouncer";
 
 char *cf_admin_users = "";
 char *cf_stats_users = "";
@@ -119,6 +121,8 @@ ConfElem bouncer_params[] = {
 {"pool_mode",          true, {get_mode, set_mode}},
 {"max_client_conn",    true, CF_INT, &cf_max_client_conn},
 {"default_pool_size",  true, CF_INT, &cf_default_pool_size},
+{"syslog",             true, CF_INT, &cf_syslog},
+{"syslog_facility",    true, CF_STR, &cf_syslog_facility},
 
 {"server_reset_query", true, CF_STR, &cf_server_reset_query},
 {"server_check_query", true, CF_STR, &cf_server_check_query},
index ad3b0c803bc271a5ddd702de9e351bc46bf29361..80443cbc04e896495aaa78f21db0e88df618b423 100644 (file)
 
 #include "bouncer.h"
 
+#include <syslog.h>
+
 #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 },
+       { "authpriv",   LOG_AUTHPRIV },
+       { "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 },
+};
+
+
 void *zmalloc(size_t len)
 {
        void *p = malloc(len);
@@ -45,7 +68,48 @@ static void render_time(char *buf, int max)
        strftime(buf, max, "%Y-%m-%d %H:%M:%S", &tm);
 }
 
-static int log_fd = 0;
+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)
 {
@@ -53,6 +117,7 @@ void close_logfile(void)
                safe_close(log_fd);
                log_fd = 0;
        }
+       close_syslog();
 }
 
 static void write_logfile(const char *buf, int len)
@@ -79,6 +144,9 @@ static void _log_write(const char *pfx, const char *msg)
        if (cf_logfile)
                write_logfile(buf, len);
 
+       if (cf_syslog)
+               write_syslog(pfx, msg);
+
        if (!cf_quiet)
                fprintf(stderr, "%s", buf);
 }