From 80532e85b3fb25d95dfff87c822cae8ca6f5bbfa Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Thu, 6 Dec 2007 08:32:42 +0000 Subject: [PATCH] support sending log to syslog --- doc/config.txt | 13 +++++++++ include/bouncer.h | 4 +++ src/main.c | 6 +++- src/util.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 91 insertions(+), 2 deletions(-) diff --git a/doc/config.txt b/doc/config.txt index a66db45..c2069d0 100644 --- a/doc/config.txt +++ b/doc/config.txt @@ -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. diff --git a/include/bouncer.h b/include/bouncer.h index 0ecfea6..022098c 100644 --- a/include/bouncer.h +++ b/include/bouncer.h @@ -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; diff --git a/src/main.c b/src/main.c index ad3d677..00319a7 100644 --- a/src/main.c +++ b/src/main.c @@ -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}, diff --git a/src/util.c b/src/util.c index ad3b0c8..80443cb 100644 --- a/src/util.c +++ b/src/util.c @@ -22,8 +22,31 @@ #include "bouncer.h" +#include + #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); } -- 2.39.5