From 7a87bf25a6881fe0be9954bb2c97403a15dbeb0b Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Mon, 12 Mar 2012 22:31:13 +0000 Subject: [PATCH] Cleanup + implement conditional logging This patch: * fixes signatures for log_debug and log_pdu macros * collapses __log_ functions into one * adds conditional logging Here conditional logging means that the logging priority and logging level may vary depending on some dynamic parameters. This is helpful when software is able to recover from errors which occur periodically and hence, there is no need to pollute system logs with tons of repetitive non-critical lines. The following macros are added to support this feature: * log_info_cond * log_warning_cond * log_error_cond They take an additional first parameter called "level". If it is 0 then they act as their non-cond counterparts, otherwise they act like log_debug with the specified level. Those who are not interested in conditional logging are not affected: they can continue using plain old logging macros without any changes. Signed-off-by: Sergey Myasnikov git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4161 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- iscsi-scst/usr/iscsid.h | 33 +++++++++++++++++----------- iscsi-scst/usr/log.c | 48 ++++++++++++----------------------------- 2 files changed, 34 insertions(+), 47 deletions(-) diff --git a/iscsi-scst/usr/iscsid.h b/iscsi-scst/usr/iscsid.h index b5e5d1c57..e455a90d6 100644 --- a/iscsi-scst/usr/iscsid.h +++ b/iscsi-scst/usr/iscsid.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "types.h" #ifdef INSIDE_KERNEL_TREE @@ -264,21 +265,27 @@ extern int log_daemon; extern int log_level; extern void log_init(void); -extern void __log_info(const char *func, int line, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))); -extern void __log_warning(const char *func, int line, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))); -extern void __log_error(const char *func, int line, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))); -extern void __log_debug(const char *func, int line, int level, const char *fmt, ...) - __attribute__ ((format (printf, 4, 5))); +extern void __log(const char *func, int line, int prio, int level, const char *fmt, ...) + __attribute__ ((format (printf, 5, 6))); extern void __log_pdu(const char *func, int line, int level, struct PDU *pdu); -#define log_info(args...) __log_info(__func__, __LINE__, ## args) -#define log_warning(args...) __log_warning(__func__, __LINE__, ## args) -#define log_error(args...) __log_error(__func__, __LINE__, ## args) -#define log_debug(args...) __log_debug(__func__, __LINE__, ## args) -#define log_pdu(args...) __log_pdu(__func__, __LINE__, ## args) +#define log_info(args...) __log(__func__, __LINE__, LOG_INFO, 0, ## args) +#define log_warning(args...) __log(__func__, __LINE__, LOG_WARNING, 0, ## args) +#define log_error(args...) __log(__func__, __LINE__, LOG_ERR, 0, ## args) +#define log_debug(level, args...) __log(__func__, __LINE__, LOG_DEBUG, level, ## args) +#define log_pdu(level, args...) __log_pdu(__func__, __LINE__, level, ## args) + +/* Conditional versions of log_* functions. Useful when log priority depends + * on some parameter, say recurrence of some event. In these cases the first + * occurence could be logged as log_info while the latter ones may be logged + * with log_debug. So, if level != 0 then log_debug is called. + */ +#define log_info_cond(level, args...) \ + __log(__func__, __LINE__, LOG_INFO, level, ## args) +#define log_warning_cond(level, args...) \ + __log(__func__, __LINE__, LOG_WARNING, level, ## args) +#define log_error_cond(level, args...) \ + __log(__func__, __LINE__, LOG_ERR, level, ## args) /* session.c */ extern struct session *session_find_name(u32 tid, const char *iname, union iscsi_sid sid); diff --git a/iscsi-scst/usr/log.c b/iscsi-scst/usr/log.c index c7d6d54a5..ffb5f33cd 100644 --- a/iscsi-scst/usr/log.c +++ b/iscsi-scst/usr/log.c @@ -82,38 +82,18 @@ static void dolog(int prio, const char *func, int line, const char *fmt, va_list } } -void __log_info(const char *func, int line, const char *fmt, ...) +void __log(const char *func, int line, int prio, int level, const char *fmt, ...) { - va_list ap; - va_start(ap, fmt); - dolog(LOG_INFO, func, line, fmt, ap); - va_end(ap); -} - -void __log_warning(const char *func, int line, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - dolog(LOG_WARNING, func, line, fmt, ap); - va_end(ap); -} - -void __log_error(const char *func, int line, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - dolog(LOG_ERR, func, line, fmt, ap); - va_end(ap); -} - -void __log_debug(const char *func, int line, int level, const char *fmt, ...) -{ - if (log_level >= level) { - va_list ap; - va_start(ap, fmt); - dolog(LOG_DEBUG, func, line, fmt, ap); - va_end(ap); + if (level) { + prio = LOG_DEBUG; + if (log_level < level) + return; } + + va_list ap; + va_start(ap, fmt); + dolog(prio, func, line, fmt, ap); + va_end(ap); } /* Definition for __log_pdu buffer */ @@ -145,7 +125,7 @@ static void __dump_line(const char *func, int line_num, int level, unsigned char } /* buf is not \0-terminated! */ - __log_debug(func, line_num, level, "%s %.*s |", line, BUFFER_SIZE, buf); + __log(func, line_num, LOG_DEBUG, level, "%s %.*s |", line, BUFFER_SIZE, buf); *cp = 0; } @@ -172,19 +152,19 @@ void __log_pdu(const char *func, int line, int level, struct PDU *pdu) return; buf = (void *)&pdu->bhs; - __log_debug(func, line, level, "BHS: (%p)", buf); + __log(func, line, LOG_DEBUG, level, "BHS: (%p)", buf); for (i = 0; i < BHS_SIZE; i++) dump_char(*buf++); dump_line(); buf = (void *)pdu->ahs; - __log_debug(func, line, level, "AHS: (%p)", buf); + __log(func, line, LOG_DEBUG, level, "AHS: (%p)", buf); for (i = 0; i < pdu->ahssize; i++) dump_char(*buf++); dump_line(); buf = (void *)pdu->data; - __log_debug(func, line, level, "Data: (%p)", buf); + __log(func, line, LOG_DEBUG, level, "Data: (%p)", buf); for (i = 0; i < pdu->datasize; i++) dump_char(*buf++); dump_line();