diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-10 16:40:52 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2015-10-13 14:40:46 +0200 |
commit | 0641e3a5fd19628db0e08fca252c13f40230ffa2 (patch) | |
tree | f16a125cf84f8fa591d0af012bd1aa6b1e9169f7 | |
parent | 11a084cf42e79f130e4389bac57688cfd6657fc1 (diff) | |
download | lvm2-0641e3a5fd19628db0e08fca252c13f40230ffa2.tar.gz |
libdmevent: add dm_event_log
Add dm_event_log() logging function.
Controled by dm_event_log_set().
-rw-r--r-- | daemons/dmeventd/libdevmapper-event.c | 81 | ||||
-rw-r--r-- | daemons/dmeventd/libdevmapper-event.h | 21 |
2 files changed, 99 insertions, 3 deletions
diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c index 81f18c9c4..9b04b0274 100644 --- a/daemons/dmeventd/libdevmapper-event.c +++ b/daemons/dmeventd/libdevmapper-event.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2005-2015 Red Hat, Inc. All rights reserved. * * This file is part of the device-mapper userspace tools. * @@ -12,9 +12,9 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "dm-logging.h" #include "dmlib.h" #include "libdevmapper-event.h" -//#include "libmultilog.h" #include "dmeventd.h" #include <fcntl.h> @@ -23,7 +23,11 @@ #include <sys/stat.h> #include <sys/wait.h> #include <arpa/inet.h> /* for htonl, ntohl */ +#include <pthread.h> +#include <syslog.h> +static int _debug_level = 0; +static int _use_syslog = 0; static int _sequence_nr = 0; struct dm_event_handler { @@ -823,6 +827,79 @@ int dm_event_get_version(struct dm_event_fifos *fifos, int *version) { return 1; } +void dm_event_log_set(int debug_level, int use_syslog) +{ + _debug_level = debug_level; + _use_syslog = use_syslog; +} + +void dm_event_log(const char *subsys, int level, const char *file, + int line, int dm_errno_or_class, + const char *format, va_list ap) +{ + static pthread_mutex_t _log_mutex = PTHREAD_MUTEX_INITIALIZER; + static time_t start = 0; + const char *indent = ""; + FILE *stream = stdout; + int prio = -1; + time_t now; + + switch (level & ~(_LOG_STDERR | _LOG_ONCE)) { + case _LOG_DEBUG: + if (_debug_level < 3) + return; + prio = LOG_DEBUG; + indent = " "; + break; + case _LOG_INFO: + if (_debug_level < 2) + return; + prio = LOG_INFO; + indent = " "; + break; + case _LOG_NOTICE: + if (_debug_level < 1) + return; + prio = LOG_NOTICE; + indent = " "; + break; + case _LOG_WARN: + prio = LOG_WARNING; + break; + case _LOG_ERR: + prio = LOG_ERR; + stream = stderr; + break; + default: + prio = LOG_CRIT; + } + + /* Serialize to keep lines readable */ + pthread_mutex_lock(&_log_mutex); + + if (_use_syslog) { + vsyslog(prio, format, ap); + } else { + now = time(NULL); + if (!start) + start = now; + now -= start; + fprintf(stream, "[%2d:%02d] %8x:%-6s%s", + (int)now / 60, (int)now % 60, + // TODO: Maybe use shorter ID + // ((int)(pthread_self()) >> 6) & 0xffff, + (int)pthread_self(), subsys, + (_debug_level > 3) ? "" : indent); + if (_debug_level > 3) + fprintf(stream, "%28s:%4d %s", file, line, indent); + vfprintf(stream, _(format), ap); + fputc('\n', stream); + fflush(stream); + } + + pthread_mutex_unlock(&_log_mutex); +} + #if 0 /* left out for now */ static char *_skip_string(char *src, const int delimiter) diff --git a/daemons/dmeventd/libdevmapper-event.h b/daemons/dmeventd/libdevmapper-event.h index 532bebf12..a00702a5b 100644 --- a/daemons/dmeventd/libdevmapper-event.h +++ b/daemons/dmeventd/libdevmapper-event.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2005-2015 Red Hat, Inc. All rights reserved. * * This file is part of the device-mapper userspace tools. * @@ -105,6 +105,25 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next); int dm_event_register_handler(const struct dm_event_handler *dmevh); int dm_event_unregister_handler(const struct dm_event_handler *dmevh); +/* Set debug level for logging, and whether to log on stdout/stderr or syslog */ +void dm_event_log_set(int debug_level, int use_syslog); + +/* Log messages acroding to current debug level */ +__attribute__((format(printf, 6, 0))) +void dm_event_log(const char *subsys, int level, const char *file, + int line, int dm_errno_or_class, + const char *format, va_list ap); +/* Macro to route print_log do dm_event_log() */ +#define DM_EVENT_LOG_FN(subsys) \ +void print_log(int level, const char *file, int line, int dm_errno_or_class,\ + const char *format, ...)\ +{\ + va_list ap;\ + va_start(ap, format);\ + dm_event_log(subsys, level, file, line, dm_errno_or_class, format, ap);\ + va_end(ap);\ +} + /* Prototypes for DSO interface, see dmeventd.c, struct dso_data for detailed descriptions. */ // FIXME misuse of bitmask as enum |