rename 'debug' interface to 'logging' interface

It's not really about debugging, but about generic logging...
This commit is contained in:
Harald Welte 2010-03-26 21:24:24 +08:00
parent faadfe2b93
commit 3ae2758fba
5 changed files with 186 additions and 186 deletions

View File

@ -1,7 +1,7 @@
osmocore_HEADERS = signal.h linuxlist.h timer.h select.h msgb.h \
tlv.h bitvec.h comp128.h statistics.h gsm_utils.h utils.h \
gsmtap.h write_queue.h rsl.h gsm48.h rxlev_stat.h mncc.h \
gsm48_ie.h debug.h
gsm48_ie.h logging.h
if ENABLE_TALLOC
osmocore_HEADERS += talloc.h

View File

@ -1,130 +0,0 @@
#ifndef _OSMOCORE_DEBUG_H
#define _OSMOCORE_DEBUG_H
#include <stdio.h>
#include <stdint.h>
#include <osmocore/linuxlist.h>
#define DEBUG_MAX_CATEGORY 32
#define DEBUG_MAX_CTX 8
#define DEBUG_MAX_FILTERS 8
#define DEBUG
#ifdef DEBUG
#define DEBUGP(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 0, fmt, ## args)
#define DEBUGPC(ss, fmt, args...) debugp(ss, __FILE__, __LINE__, 1, fmt, ## args)
#else
#define DEBUGP(xss, fmt, args...)
#define DEBUGPC(ss, fmt, args...)
#endif
#define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
char *hexdump(const unsigned char *buf, int len);
void debugp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
/* new logging interface */
#define LOGP(ss, level, fmt, args...) \
debugp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
#define LOGPC(ss, level, fmt, args...) \
debugp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
/* different levels */
#define LOGL_DEBUG 1 /* debugging information */
#define LOGL_INFO 3
#define LOGL_NOTICE 5 /* abnormal/unexpected condition */
#define LOGL_ERROR 7 /* error condition, requires user action */
#define LOGL_FATAL 8 /* fatal, program aborted */
#define DEBUG_FILTER_ALL 0x0001
struct debug_category {
uint8_t loglevel;
uint8_t enabled;
};
struct debug_info_cat {
const char *name;
const char *color;
const char *description;
uint8_t loglevel;
uint8_t enabled;
};
/* debug context information, passed to filter */
struct debug_context {
void *ctx[DEBUG_MAX_CTX+1];
};
struct debug_target;
typedef int debug_filter(const struct debug_context *ctx,
struct debug_target *target);
struct debug_info {
/* filter callback function */
debug_filter *filter_fn;
/* per-category information */
const struct debug_info_cat *cat;
unsigned int num_cat;
};
struct debug_target {
struct llist_head entry;
int filter_map;
void *filter_data[DEBUG_MAX_FILTERS+1];
struct debug_category categories[DEBUG_MAX_CATEGORY+1];
uint8_t loglevel;
int use_color:1;
int print_timestamp:1;
union {
struct {
FILE *out;
} tgt_stdout;
struct {
int priority;
} tgt_syslog;
struct {
void *vty;
} tgt_vty;
};
void (*output) (struct debug_target *target, const char *string);
};
/* use the above macros */
void debugp2(unsigned int subsys, unsigned int level, char *file,
int line, int cont, const char *format, ...)
__attribute__ ((format (printf, 6, 7)));
void debug_init(const struct debug_info *cat);
/* context management */
void debug_reset_context(void);
int debug_set_context(uint8_t ctx, void *value);
/* filter on the targets */
void debug_set_all_filter(struct debug_target *target, int);
void debug_set_use_color(struct debug_target *target, int);
void debug_set_print_timestamp(struct debug_target *target, int);
void debug_set_log_level(struct debug_target *target, int log_level);
void debug_parse_category_mask(struct debug_target *target, const char* mask);
int debug_parse_level(const char *lvl);
int debug_parse_category(const char *category);
void debug_set_category_filter(struct debug_target *target, int category,
int enable, int level);
/* management of the targets */
struct debug_target *debug_target_create(void);
struct debug_target *debug_target_create_stderr(void);
void debug_add_target(struct debug_target *target);
void debug_del_target(struct debug_target *target);
#endif /* _OSMOCORE_DEBUG_H */

130
include/osmocore/logging.h Normal file
View File

@ -0,0 +1,130 @@
#ifndef _OSMOCORE_LOGGING_H
#define _OSMOCORE_LOGGING_H
#include <stdio.h>
#include <stdint.h>
#include <osmocore/linuxlist.h>
#define LOG_MAX_CATEGORY 32
#define LOG_MAX_CTX 8
#define LOG_MAX_FILTERS 8
#define DEBUG
#ifdef DEBUG
#define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
#define DEBUGPC(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 1, fmt, ## args)
#else
#define DEBUGP(xss, fmt, args...)
#define DEBUGPC(ss, fmt, args...)
#endif
#define static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1];
char *hexdump(const unsigned char *buf, int len);
void logp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
/* new logging interface */
#define LOGP(ss, level, fmt, args...) \
logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
#define LOGPC(ss, level, fmt, args...) \
logp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
/* different levels */
#define LOGL_DEBUG 1 /* debugging information */
#define LOGL_INFO 3
#define LOGL_NOTICE 5 /* abnormal/unexpected condition */
#define LOGL_ERROR 7 /* error condition, requires user action */
#define LOGL_FATAL 8 /* fatal, program aborted */
#define LOG_FILTER_ALL 0x0001
struct log_category {
uint8_t loglevel;
uint8_t enabled;
};
struct log_info_cat {
const char *name;
const char *color;
const char *description;
uint8_t loglevel;
uint8_t enabled;
};
/* log context information, passed to filter */
struct log_context {
void *ctx[LOG_MAX_CTX+1];
};
struct log_target;
typedef int log_filter(const struct log_context *ctx,
struct log_target *target);
struct log_info {
/* filter callback function */
log_filter *filter_fn;
/* per-category information */
const struct log_info_cat *cat;
unsigned int num_cat;
};
struct log_target {
struct llist_head entry;
int filter_map;
void *filter_data[LOG_MAX_FILTERS+1];
struct log_category categories[LOG_MAX_CATEGORY+1];
uint8_t loglevel;
int use_color:1;
int print_timestamp:1;
union {
struct {
FILE *out;
} tgt_stdout;
struct {
int priority;
} tgt_syslog;
struct {
void *vty;
} tgt_vty;
};
void (*output) (struct log_target *target, const char *string);
};
/* use the above macros */
void logp2(unsigned int subsys, unsigned int level, char *file,
int line, int cont, const char *format, ...)
__attribute__ ((format (printf, 6, 7)));
void log_init(const struct log_info *cat);
/* context management */
void log_reset_context(void);
int log_set_context(uint8_t ctx, void *value);
/* filter on the targets */
void log_set_all_filter(struct log_target *target, int);
void log_set_use_color(struct log_target *target, int);
void log_set_print_timestamp(struct log_target *target, int);
void log_set_log_level(struct log_target *target, int log_level);
void log_parse_category_mask(struct log_target *target, const char* mask);
int log_parse_level(const char *lvl);
int log_parse_category(const char *category);
void log_set_category_filter(struct log_target *target, int category,
int enable, int level);
/* management of the targets */
struct log_target *log_target_create(void);
struct log_target *log_target_create_stderr(void);
void log_add_target(struct log_target *target);
void log_del_target(struct log_target *target);
#endif /* _OSMOCORE_LOGGING_H */

View File

@ -10,7 +10,7 @@ lib_LTLIBRARIES = libosmocore.la
libosmocore_la_SOURCES = timer.c select.c signal.c msgb.c rxlev_stat.c \
tlv_parser.c bitvec.c comp128.c gsm_utils.c statistics.c \
write_queue.c utils.c rsl.c gsm48.c gsm48_ie.c \
debug.c
logging.c
if ENABLE_TALLOC
libosmocore_la_SOURCES += talloc.c

View File

@ -30,12 +30,12 @@
#include <osmocore/talloc.h>
#include <osmocore/utils.h>
#include <osmocore/debug.h>
#include <osmocore/logging.h>
static const struct debug_info *debug_info;
static const struct log_info *log_info;
static struct debug_context debug_context;
static void *tall_dbg_ctx = NULL;
static struct log_context log_context;
static void *tall_log_ctx = NULL;
static LLIST_HEAD(target_list);
static const struct value_string loglevel_strs[] = {
@ -48,17 +48,17 @@ static const struct value_string loglevel_strs[] = {
{ 0, NULL },
};
int debug_parse_level(const char *lvl)
int log_parse_level(const char *lvl)
{
return get_string_value(loglevel_strs, lvl);
}
int debug_parse_category(const char *category)
int log_parse_category(const char *category)
{
int i;
for (i = 0; i < debug_info->num_cat; ++i) {
if (!strcasecmp(debug_info->cat[i].name+1, category))
for (i = 0; i < log_info->num_cat; ++i) {
if (!strcasecmp(log_info->cat[i].name+1, category))
return i;
}
@ -70,7 +70,7 @@ int debug_parse_category(const char *category)
* The format can be this: category1:category2:category3
* or category1,2:category2,3:...
*/
void debug_parse_category_mask(struct debug_target* target, const char *_mask)
void log_parse_category_mask(struct log_target* target, const char *_mask)
{
int i = 0;
char *mask = strdup(_mask);
@ -82,14 +82,14 @@ void debug_parse_category_mask(struct debug_target* target, const char *_mask)
category_token = strtok(mask, ":");
do {
for (i = 0; i < debug_info->num_cat; ++i) {
for (i = 0; i < log_info->num_cat; ++i) {
char* colon = strstr(category_token, ",");
int length = strlen(category_token);
if (colon)
length = colon - category_token;
if (strncasecmp(debug_info->cat[i].name, category_token,
if (strncasecmp(log_info->cat[i].name, category_token,
length) == 0) {
int level = 0;
@ -107,13 +107,13 @@ void debug_parse_category_mask(struct debug_target* target, const char *_mask)
static const char* color(int subsys)
{
if (subsys < debug_info->num_cat)
return debug_info->cat[subsys].color;
if (subsys < log_info->num_cat)
return log_info->cat[subsys].color;
return NULL;
}
static void _output(struct debug_target *target, unsigned int subsys,
static void _output(struct log_target *target, unsigned int subsys,
char *file, int line, int cont, const char *format,
va_list ap)
{
@ -160,17 +160,17 @@ static void _output(struct debug_target *target, unsigned int subsys,
}
static void _debugp(unsigned int subsys, int level, char *file, int line,
int cont, const char *format, va_list ap)
static void _logp(unsigned int subsys, int level, char *file, int line,
int cont, const char *format, va_list ap)
{
struct debug_target *tar;
struct log_target *tar;
llist_for_each_entry(tar, &target_list, entry) {
struct debug_category *category;
struct log_category *category;
int output = 0;
category = &tar->categories[subsys];
/* subsystem is not supposed to be debugged */
/* subsystem is not supposed to be logged */
if (!category->enabled)
continue;
@ -186,10 +186,10 @@ static void _debugp(unsigned int subsys, int level, char *file, int line,
/* Apply filters here... if that becomes messy we will
* need to put filters in a list and each filter will
* say stop, continue, output */
if ((tar->filter_map & DEBUG_FILTER_ALL) != 0)
if ((tar->filter_map & LOG_FILTER_ALL) != 0)
output = 1;
else if (debug_info->filter_fn)
output = debug_info->filter_fn(&debug_context,
else if (log_info->filter_fn)
output = log_info->filter_fn(&log_context,
tar);
if (output) {
@ -207,22 +207,22 @@ static void _debugp(unsigned int subsys, int level, char *file, int line,
}
}
void debugp(unsigned int subsys, char *file, int line, int cont,
const char *format, ...)
void logp(unsigned int subsys, char *file, int line, int cont,
const char *format, ...)
{
va_list ap;
va_start(ap, format);
_debugp(subsys, LOGL_DEBUG, file, line, cont, format, ap);
_logp(subsys, LOGL_DEBUG, file, line, cont, format, ap);
va_end(ap);
}
void debugp2(unsigned int subsys, unsigned int level, char *file, int line, int cont, const char *format, ...)
void logp2(unsigned int subsys, unsigned int level, char *file, int line, int cont, const char *format, ...)
{
va_list ap;
va_start(ap, format);
_debugp(subsys, level, file, line, cont, format, ap);
_logp(subsys, level, file, line, cont, format, ap);
va_end(ap);
}
@ -245,91 +245,91 @@ char *hexdump(const unsigned char *buf, int len)
return hexd_buff;
}
void debug_add_target(struct debug_target *target)
void log_add_target(struct log_target *target)
{
llist_add_tail(&target->entry, &target_list);
}
void debug_del_target(struct debug_target *target)
void log_del_target(struct log_target *target)
{
llist_del(&target->entry);
}
void debug_reset_context(void)
void log_reset_context(void)
{
memset(&debug_context, 0, sizeof(debug_context));
memset(&log_context, 0, sizeof(log_context));
}
int debug_set_context(uint8_t ctx_nr, void *value)
int log_set_context(uint8_t ctx_nr, void *value)
{
if (ctx_nr > DEBUG_MAX_CTX)
if (ctx_nr > LOG_MAX_CTX)
return -EINVAL;
debug_context.ctx[ctx_nr] = value;
log_context.ctx[ctx_nr] = value;
return 0;
}
void debug_set_all_filter(struct debug_target *target, int all)
void log_set_all_filter(struct log_target *target, int all)
{
if (all)
target->filter_map |= DEBUG_FILTER_ALL;
target->filter_map |= LOG_FILTER_ALL;
else
target->filter_map &= ~DEBUG_FILTER_ALL;
target->filter_map &= ~LOG_FILTER_ALL;
}
void debug_set_use_color(struct debug_target *target, int use_color)
void log_set_use_color(struct log_target *target, int use_color)
{
target->use_color = use_color;
}
void debug_set_print_timestamp(struct debug_target *target, int print_timestamp)
void log_set_print_timestamp(struct log_target *target, int print_timestamp)
{
target->print_timestamp = print_timestamp;
}
void debug_set_log_level(struct debug_target *target, int log_level)
void log_set_log_level(struct log_target *target, int log_level)
{
target->loglevel = log_level;
}
void debug_set_category_filter(struct debug_target *target, int category,
void log_set_category_filter(struct log_target *target, int category,
int enable, int level)
{
if (category >= debug_info->num_cat)
if (category >= log_info->num_cat)
return;
target->categories[category].enabled = !!enable;
target->categories[category].loglevel = level;
}
static void _stderr_output(struct debug_target *target, const char *log)
static void _stderr_output(struct log_target *target, const char *log)
{
fprintf(target->tgt_stdout.out, "%s", log);
fflush(target->tgt_stdout.out);
}
struct debug_target *debug_target_create(void)
struct log_target *log_target_create(void)
{
struct debug_target *target;
struct log_target *target;
target = talloc_zero(tall_dbg_ctx, struct debug_target);
target = talloc_zero(tall_log_ctx, struct log_target);
if (!target)
return NULL;
INIT_LLIST_HEAD(&target->entry);
memcpy(target->categories, debug_info->cat,
sizeof(struct debug_category)*debug_info->num_cat);
memcpy(target->categories, log_info->cat,
sizeof(struct log_category)*log_info->num_cat);
target->use_color = 1;
target->print_timestamp = 0;
target->loglevel = 0;
return target;
}
struct debug_target *debug_target_create_stderr(void)
struct log_target *log_target_create_stderr(void)
{
struct debug_target *target;
struct log_target *target;
target = debug_target_create();
target = log_target_create();
if (!target)
return NULL;
@ -338,8 +338,8 @@ struct debug_target *debug_target_create_stderr(void)
return target;
}
void debug_init(const struct debug_info *cat)
void log_init(const struct log_info *cat)
{
tall_dbg_ctx = talloc_named_const(NULL, 1, "debug");
debug_info = cat;
tall_log_ctx = talloc_named_const(NULL, 1, "logging");
log_info = cat;
}