|
@ -20,7 +20,12 @@ struct log_entry { |
|
|
struct log_record { |
|
|
struct log_record { |
|
|
size_t mem_used; |
|
|
size_t mem_used; |
|
|
size_t max_mem; |
|
|
size_t max_mem; |
|
|
enum log_level print; |
|
|
void (*print)(const char *prefix, |
|
|
|
|
|
enum log_level level, |
|
|
|
|
|
bool continued, |
|
|
|
|
|
const char *str, void *arg); |
|
|
|
|
|
void *print_arg; |
|
|
|
|
|
enum log_level print_level; |
|
|
struct timeabs init_time; |
|
|
struct timeabs init_time; |
|
|
|
|
|
|
|
|
struct list_head log; |
|
|
struct list_head log; |
|
@ -31,6 +36,18 @@ struct log { |
|
|
const char *prefix; |
|
|
const char *prefix; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
static void log_default_print(const char *prefix, |
|
|
|
|
|
enum log_level level, |
|
|
|
|
|
bool continued, |
|
|
|
|
|
const char *str, void *arg) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!continued) { |
|
|
|
|
|
printf("%s %s\n", prefix, str); |
|
|
|
|
|
} else { |
|
|
|
|
|
printf("%s \t%s\n", prefix, str); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static size_t log_bufsize(const struct log_entry *e) |
|
|
static size_t log_bufsize(const struct log_entry *e) |
|
|
{ |
|
|
{ |
|
|
if (e->level == LOG_IO) |
|
|
if (e->level == LOG_IO) |
|
@ -76,7 +93,8 @@ struct log_record *new_log_record(const tal_t *ctx, |
|
|
assert(max_mem > sizeof(struct log) * 2); |
|
|
assert(max_mem > sizeof(struct log) * 2); |
|
|
lr->mem_used = 0; |
|
|
lr->mem_used = 0; |
|
|
lr->max_mem = max_mem; |
|
|
lr->max_mem = max_mem; |
|
|
lr->print = printlevel; |
|
|
lr->print = log_default_print; |
|
|
|
|
|
lr->print_level = printlevel; |
|
|
lr->init_time = time_now(); |
|
|
lr->init_time = time_now(); |
|
|
list_head_init(&lr->log); |
|
|
list_head_init(&lr->log); |
|
|
|
|
|
|
|
@ -101,7 +119,7 @@ new_log(const tal_t *ctx, struct log_record *record, const char *fmt, ...) |
|
|
|
|
|
|
|
|
void set_log_level(struct log_record *lr, enum log_level level) |
|
|
void set_log_level(struct log_record *lr, enum log_level level) |
|
|
{ |
|
|
{ |
|
|
lr->print = level; |
|
|
lr->print_level = level; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void set_log_prefix(struct log *log, const char *prefix) |
|
|
void set_log_prefix(struct log *log, const char *prefix) |
|
@ -110,6 +128,17 @@ void set_log_prefix(struct log *log, const char *prefix) |
|
|
log->prefix = tal_strdup(log->lr, prefix); |
|
|
log->prefix = tal_strdup(log->lr, prefix); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void set_log_outfn_(struct log_record *lr, |
|
|
|
|
|
void (*print)(const char *prefix, |
|
|
|
|
|
enum log_level level, |
|
|
|
|
|
bool continued, |
|
|
|
|
|
const char *str, void *arg), |
|
|
|
|
|
void *arg) |
|
|
|
|
|
{ |
|
|
|
|
|
lr->print = print; |
|
|
|
|
|
lr->print_arg = arg; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const char *log_prefix(const struct log *log) |
|
|
const char *log_prefix(const struct log *log) |
|
|
{ |
|
|
{ |
|
|
return log->prefix; |
|
|
return log->prefix; |
|
@ -161,8 +190,9 @@ void logv(struct log *log, enum log_level level, const char *fmt, va_list ap) |
|
|
|
|
|
|
|
|
l->log = tal_vfmt(l, fmt, ap); |
|
|
l->log = tal_vfmt(l, fmt, ap); |
|
|
|
|
|
|
|
|
if (level >= log->lr->print) |
|
|
if (level >= log->lr->print_level) |
|
|
printf("%s %s\n", log->prefix, l->log); |
|
|
log->lr->print(log->prefix, level, false, l->log, |
|
|
|
|
|
log->lr->print_arg); |
|
|
|
|
|
|
|
|
add_entry(log, l); |
|
|
add_entry(log, l); |
|
|
} |
|
|
} |
|
@ -176,12 +206,16 @@ void log_io(struct log *log, bool in, const void *data, size_t len) |
|
|
l->log[0] = in; |
|
|
l->log[0] = in; |
|
|
memcpy(l->log + 1, data, len); |
|
|
memcpy(l->log + 1, data, len); |
|
|
|
|
|
|
|
|
if (LOG_IO >= log->lr->print) { |
|
|
if (LOG_IO >= log->lr->print_level) { |
|
|
char *hex = tal_arr(l, char, hex_str_size(len)); |
|
|
const char *dir = in ? "[IN]" : "[OUT]"; |
|
|
hex_encode(data, len, hex, hex_str_size(len)); |
|
|
char *hex = tal_arr(l, char, strlen(dir) + hex_str_size(len)); |
|
|
printf("%s[%s] %s\n", log->prefix, in ? "IN" : "OUT", hex); |
|
|
strcpy(hex, dir); |
|
|
|
|
|
hex_encode(data, len, hex + strlen(dir), hex_str_size(len)); |
|
|
|
|
|
log->lr->print(log->prefix, LOG_IO, false, l->log, |
|
|
|
|
|
log->lr->print_arg); |
|
|
tal_free(hex); |
|
|
tal_free(hex); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
add_entry(log, l); |
|
|
add_entry(log, l); |
|
|
errno = save_errno; |
|
|
errno = save_errno; |
|
|
} |
|
|
} |
|
@ -198,8 +232,9 @@ static void do_log_add(struct log *log, const char *fmt, va_list ap) |
|
|
tal_append_vfmt(&l->log, fmt, ap); |
|
|
tal_append_vfmt(&l->log, fmt, ap); |
|
|
add_entry(log, l); |
|
|
add_entry(log, l); |
|
|
|
|
|
|
|
|
if (l->level >= log->lr->print) |
|
|
if (l->level >= log->lr->print_level) |
|
|
printf("%s \t%s\n", log->prefix, l->log + oldlen); |
|
|
log->lr->print(log->prefix, l->level, true, l->log + oldlen, |
|
|
|
|
|
log->lr->print_arg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void log_(struct log *log, enum log_level level, const char *fmt, ...) |
|
|
void log_(struct log *log, enum log_level level, const char *fmt, ...) |
|
|