lightningd: have logging include an optional node_id for each entry.

A log can have a default node_id, which can be overridden on a per-entry
basis.  This changes the format of logging, so some tests need rework.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2019-11-17 22:11:33 +10:30
parent 4fa7b30836
commit e433d4ddc1
23 changed files with 176 additions and 85 deletions

View File

@@ -52,6 +52,7 @@ static const char *level_prefix(enum log_level level)
static void log_to_file(const char *prefix,
enum log_level level,
const struct node_id *node_id,
bool continued,
const struct timeabs *time,
const char *str,
@@ -67,11 +68,24 @@ static void log_to_file(const char *prefix,
if (level == LOG_IO_IN || level == LOG_IO_OUT) {
const char *dir = level == LOG_IO_IN ? "[IN]" : "[OUT]";
char *hex = tal_hexstr(NULL, io, io_len);
fprintf(logf, "%s %s%s%s %s\n",
iso8601_s, prefix, str, dir, hex);
if (!node_id)
fprintf(logf, "%s %s%s%s %s\n",
iso8601_s, prefix, str, dir, hex);
else
fprintf(logf, "%s %s-%s%s%s %s\n",
iso8601_s,
node_id_to_hexstr(tmpctx, node_id),
prefix, str, dir, hex);
tal_free(hex);
} else if (!continued) {
fprintf(logf, "%s %s %s %s\n", iso8601_s, level_prefix(level), prefix, str);
if (!node_id)
fprintf(logf, "%s %s %s %s\n",
iso8601_s, level_prefix(level), prefix, str);
else
fprintf(logf, "%s %s %s-%s %s\n",
iso8601_s, level_prefix(level),
node_id_to_hexstr(tmpctx, node_id),
prefix, str);
} else {
fprintf(logf, "%s %s \t%s\n", iso8601_s, prefix, str);
}
@@ -80,13 +94,14 @@ static void log_to_file(const char *prefix,
static void log_to_stdout(const char *prefix,
enum log_level level,
const struct node_id *node_id,
bool continued,
const struct timeabs *time,
const char *str,
const u8 *io, size_t io_len,
void *unused UNUSED)
{
log_to_file(prefix, level, continued, time, str, io, io_len, stdout);
log_to_file(prefix, level, node_id, continued, time, str, io, io_len, stdout);
}
static size_t mem_used(const struct log_entry *e)
@@ -141,7 +156,9 @@ struct log_book *new_log_book(struct lightningd *ld, size_t max_mem,
/* With different entry points */
struct log *
new_log(const tal_t *ctx, struct log_book *record, const char *fmt, ...)
new_log(const tal_t *ctx, struct log_book *record,
const struct node_id *default_node_id,
const char *fmt, ...)
{
struct log *log = tal(ctx, struct log);
va_list ap;
@@ -152,6 +169,11 @@ new_log(const tal_t *ctx, struct log_book *record, const char *fmt, ...)
/* FIXME: Refcount this! */
log->prefix = notleak(tal_vfmt(log->lr, fmt, ap));
va_end(ap);
if (default_node_id)
log->default_node_id = tal_dup(log, struct node_id,
default_node_id);
else
log->default_node_id = NULL;
return log;
}
@@ -180,6 +202,7 @@ void set_log_prefix(struct log *log, const char *prefix)
void set_log_outfn_(struct log_book *lr,
void (*print)(const char *prefix,
enum log_level level,
const struct node_id *node,
bool continued,
const struct timeabs *time,
const char *str,
@@ -224,7 +247,8 @@ static void add_entry(struct log *log, struct log_entry *l)
}
}
static struct log_entry *new_log_entry(struct log *log, enum log_level level)
static struct log_entry *new_log_entry(struct log *log, enum log_level level,
const struct node_id *node_id)
{
struct log_entry *l = tal(log->lr, struct log_entry);
@@ -233,6 +257,12 @@ static struct log_entry *new_log_entry(struct log *log, enum log_level level)
l->skipped = 0;
l->prefix = log->prefix;
l->io = NULL;
if (!node_id)
node_id = log->default_node_id;
if (node_id)
l->node_id = tal_dup(l, struct node_id, node_id);
else
l->node_id = NULL;
return l;
}
@@ -241,16 +271,18 @@ static void maybe_print(const struct log *log, const struct log_entry *l,
size_t offset)
{
if (l->level >= log->lr->print_level)
log->lr->print(log->prefix, l->level, offset != 0,
log->lr->print(log->prefix, l->level, l->node_id, offset != 0,
&l->time, l->log + offset,
l->io, tal_bytelen(l->io), log->lr->print_arg);
}
void logv(struct log *log, enum log_level level, bool call_notifier,
const char *fmt, va_list ap)
void logv(struct log *log, enum log_level level,
const struct node_id *node_id,
bool call_notifier,
const char *fmt, va_list ap)
{
int save_errno = errno;
struct log_entry *l = new_log_entry(log, level);
struct log_entry *l = new_log_entry(log, level, node_id);
l->log = tal_vfmt(l, fmt, ap);
@@ -272,17 +304,18 @@ void logv(struct log *log, enum log_level level, bool call_notifier,
}
void log_io(struct log *log, enum log_level dir,
const struct node_id *node_id,
const char *str TAKES,
const void *data TAKES, size_t len)
{
int save_errno = errno;
struct log_entry *l = new_log_entry(log, dir);
struct log_entry *l = new_log_entry(log, dir, node_id);
assert(dir == LOG_IO_IN || dir == LOG_IO_OUT);
/* Print first, in case we need to truncate. */
if (l->level >= log->lr->print_level)
log->lr->print(log->prefix, l->level, false,
log->lr->print(log->prefix, l->level, l->node_id, false,
&l->time, str,
data, len, log->lr->print_arg);
@@ -320,13 +353,15 @@ void logv_add(struct log *log, const char *fmt, va_list ap)
maybe_print(log, l, oldlen);
}
void log_(struct log *log, enum log_level level, bool call_notifier,
const char *fmt, ...)
void log_(struct log *log, enum log_level level,
const struct node_id *node_id,
bool call_notifier,
const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
logv(log, level, call_notifier, fmt, ap);
logv(log, level, node_id, call_notifier, fmt, ap);
va_end(ap);
}
@@ -343,6 +378,7 @@ void log_each_line_(const struct log_book *lr,
void (*func)(unsigned int skipped,
struct timerel time,
enum log_level level,
const struct node_id *node_id,
const char *prefix,
const char *log,
const u8 *io,
@@ -353,7 +389,7 @@ void log_each_line_(const struct log_book *lr,
list_for_each(&lr->log, i, list) {
func(i->skipped, time_between(i->time, lr->init_time),
i->level, i->prefix, i->log, i->io, arg);
i->level, i->node_id, i->prefix, i->log, i->io, arg);
}
}
@@ -365,6 +401,7 @@ struct log_data {
static void log_one_line(unsigned int skipped,
struct timerel diff,
enum log_level level,
const struct node_id *node_id,
const char *prefix,
const char *log,
const u8 *io,
@@ -561,7 +598,7 @@ void log_backtrace_print(const char *fmt, ...)
return;
va_start(ap, fmt);
logv(crashlog, LOG_BROKEN, false, fmt, ap);
logv(crashlog, LOG_BROKEN, NULL, false, fmt, ap);
va_end(ap);
}
@@ -634,7 +671,7 @@ void fatal(const char *fmt, ...)
exit(1);
va_start(ap, fmt);
logv(crashlog, LOG_BROKEN, true, fmt, ap);
logv(crashlog, LOG_BROKEN, NULL, true, fmt, ap);
va_end(ap);
abort();
}
@@ -659,6 +696,7 @@ static void add_skipped(struct log_info *info)
static void log_to_json(unsigned int skipped,
struct timerel diff,
enum log_level level,
const struct node_id *node_id,
const char *prefix,
const char *log,
const u8 *io,
@@ -683,6 +721,8 @@ static void log_to_json(unsigned int skipped,
: level == LOG_IO_OUT ? "IO_OUT"
: "UNKNOWN");
json_add_time(info->response, "time", diff.ts);
if (node_id)
json_add_node_id(info->response, "node_id", node_id);
json_add_string(info->response, "source", prefix);
json_add_string(info->response, "log", log);
if (io)