diff options
author | Martin Schwenke <martin@meltin.net> | 2014-08-19 12:15:31 +1000 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2014-10-06 12:34:33 +0200 |
commit | b4589b954e1090a934fafd3f8e3c2cf1ed785c61 (patch) | |
tree | 19b9ccceed2d3651584d65a45ec0d09a5ea87d7c /ctdb/server/ctdb_logging.c | |
parent | 3105737c4b38b3cb4f9408cfc82cf8b49bc3fb2e (diff) | |
download | samba-b4589b954e1090a934fafd3f8e3c2cf1ed785c61.tar.gz |
ctdb-logging: Update to use Samba style debug.h/debug.c
Samba's debug subsystem has changed a lot, so CTDB's logging needs
to be rewritten to be compatible.
The new debug.h/debug.c can't just be pulled in because it has some
extra dependencies into Samba's lib/util. For now, to support the
smallest possible patch, implement a minimal subset of Samba's
debug.[ch] that just supports the DEBUG_CALLBACK logtype.
Define a callback for each logging method.
Check later to see if debug_extra (or similar) can somehow be
implemented using debug classes.
The timestamp on CTDB CLI tool and test program DEBUG() output goes
away, so update the unit test code to cope.
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Volker Lendecke <vl@samba.org>
Diffstat (limited to 'ctdb/server/ctdb_logging.c')
-rw-r--r-- | ctdb/server/ctdb_logging.c | 77 |
1 files changed, 17 insertions, 60 deletions
diff --git a/ctdb/server/ctdb_logging.c b/ctdb/server/ctdb_logging.c index 97cc3beda6f..3aba37b81d5 100644 --- a/ctdb/server/ctdb_logging.c +++ b/ctdb/server/ctdb_logging.c @@ -23,6 +23,7 @@ #include "system/syslog.h" #include "system/time.h" #include "system/filesys.h" +#include "lib/util/debug.h" struct syslog_message { uint32_t level; @@ -208,21 +209,15 @@ static struct ctdb_log_state *log_state; /* syslog logging function */ -static void ctdb_syslog_log(const char *format, va_list ap) +static void ctdb_syslog_log(void *private_ptr, int dbglevel, const char *s) { struct syslog_message *msg; int level = LOG_DEBUG; - char *s = NULL; - int len, ret; + int len; int syslog_fd; struct sockaddr_in syslog_sin; - ret = vasprintf(&s, format, ap); - if (ret == -1) { - return; - } - - switch (this_log_level) { + switch (dbglevel) { case DEBUG_EMERG: level = LOG_EMERG; break; @@ -252,7 +247,6 @@ static void ctdb_syslog_log(const char *format, va_list ap) len = offsetof(struct syslog_message, message) + strlen(debug_extra) + strlen(s) + 1; msg = malloc(len); if (msg == NULL) { - free(s); return; } msg->level = level; @@ -266,7 +260,6 @@ static void ctdb_syslog_log(const char *format, va_list ap) syslog_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (syslog_fd == -1) { printf("Failed to create syslog socket\n"); - free(s); free(msg); return; } @@ -275,15 +268,14 @@ static void ctdb_syslog_log(const char *format, va_list ap) syslog_sin.sin_port = htons(CTDB_PORT); syslog_sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - ret = sendto(syslog_fd, msg, len, 0, - (struct sockaddr *)&syslog_sin, - sizeof(syslog_sin)); + (void) sendto(syslog_fd, msg, len, 0, + (struct sockaddr *)&syslog_sin, + sizeof(syslog_sin)); /* no point in checking here since we cant log an error */ close(syslog_fd); } - free(s); free(msg); } @@ -291,23 +283,14 @@ static void ctdb_syslog_log(const char *format, va_list ap) /* log file logging function */ -static void ctdb_logfile_log(const char *format, va_list ap) +static void ctdb_logfile_log(void *private_ptr, int dbglevel, const char *s) { struct timeval t; - char *s = NULL; struct tm *tm; char tbuf[100]; char *s2 = NULL; int ret; - ret = vasprintf(&s, format, ap); - if (ret == -1) { - const char *errstr = "vasprintf failed\n"; - - sys_write(log_state->fd, errstr, strlen(errstr)); - return; - } - t = timeval_current(); tm = localtime(&t.tv_sec); @@ -316,7 +299,6 @@ static void ctdb_logfile_log(const char *format, va_list ap) ret = asprintf(&s2, "%s.%06u [%s%5u]: %s", tbuf, (unsigned)t.tv_usec, debug_extra, (unsigned)getpid(), s); - free(s); if (ret == -1) { const char *errstr = "asprintf failed\n"; sys_write(log_state->fd, errstr, strlen(errstr)); @@ -328,32 +310,12 @@ static void ctdb_logfile_log(const char *format, va_list ap) } } -static void ctdb_logfile_log_add(const char *format, va_list ap) -{ - char *s = NULL; - int ret; - - ret = vasprintf(&s, format, ap); - if (ret == -1) { - const char *errstr = "vasprintf failed\n"; - - sys_write(log_state->fd, errstr, strlen(errstr)); - return; - } - - if (s) { - sys_write(log_state->fd, s, strlen(s)); - free(s); - } -} - - - /* choose the logfile location */ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_syslog) { + debug_callback_fn callback; int ret; ctdb->log = talloc_zero(ctdb, struct ctdb_log_state); @@ -366,12 +328,10 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy log_state = ctdb->log; if (use_syslog) { - do_debug_v = ctdb_syslog_log; - do_debug_add_v = ctdb_syslog_log; + callback = ctdb_syslog_log; ctdb->log->use_syslog = true; } else if (logfile == NULL || strcmp(logfile, "-") == 0) { - do_debug_v = ctdb_logfile_log; - do_debug_add_v = ctdb_logfile_log_add; + callback = ctdb_logfile_log; ctdb->log->fd = 1; /* also catch stderr of subcommands to stdout */ ret = dup2(1, 2); @@ -380,8 +340,7 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy abort(); } } else { - do_debug_v = ctdb_logfile_log; - do_debug_add_v = ctdb_logfile_log_add; + callback = ctdb_logfile_log; ctdb->log->fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0666); if (ctdb->log->fd == -1) { @@ -390,6 +349,8 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy } } + debug_set_callback(NULL, callback); + return 0; } @@ -399,9 +360,9 @@ static void write_to_log(struct ctdb_log_state *log, { if (script_log_level <= DEBUGLEVEL) { if (log != NULL && log->prefix != NULL) { - do_debug("%s: %*.*s\n", log->prefix, len, len, buf); + dbgtext("%s: %*.*s\n", log->prefix, len, len, buf); } else { - do_debug("%*.*s\n", len, len, buf); + dbgtext("%*.*s\n", len, len, buf); } /* log it in the eventsystem as well */ if (log && log->logfn) { @@ -435,8 +396,6 @@ static void ctdb_log_handler(struct event_context *ev, struct fd_event *fde, return; } - this_log_level = script_log_level; - while (log->buf_used > 0 && (p = memchr(log->buf, '\n', log->buf_used)) != NULL) { int n1 = (p - log->buf)+1; @@ -462,7 +421,6 @@ static int log_context_destructor(struct ctdb_log_state *log) { /* Flush buffer in case it wasn't \n-terminated. */ if (log->buf_used > 0) { - this_log_level = script_log_level; write_to_log(log, log->buf, log->buf_used); } return 0; @@ -629,8 +587,7 @@ static void ctdb_tevent_logging(void *private_data, } if (lvl <= DEBUGLEVEL) { - this_log_level = lvl; - do_debug_v(fmt, ap); + dbgtext(fmt, ap); } } |