Browse Source

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>
travis-debug
Rusty Russell 5 years ago
parent
commit
e433d4ddc1
  1. 10
      contrib/pyln-testing/pyln/testing/utils.py
  2. 11
      lightningd/channel.c
  3. 2
      lightningd/json_stream.c
  4. 8
      lightningd/jsonrpc.c
  5. 3
      lightningd/lightningd.c
  6. 76
      lightningd/log.c
  7. 43
      lightningd/log.h
  8. 8
      lightningd/log_status.c
  9. 4
      lightningd/log_status.h
  10. 7
      lightningd/opening_control.c
  11. 5
      lightningd/peer_control.c
  12. 9
      lightningd/plugin.c
  13. 11
      lightningd/subd.c
  14. 13
      lightningd/test/run-find_my_abspath.c
  15. 14
      lightningd/test/run-invoice-select-inchan.c
  16. 13
      lightningd/test/run-jsonrpc.c
  17. 2
      tests/test_closing.py
  18. 2
      tests/test_connection.py
  19. 6
      tests/test_gossip.py
  20. 4
      tests/test_misc.py
  21. 3
      tests/test_plugin.py
  22. 2
      wallet/test/run-db.c
  23. 9
      wallet/test/run-wallet.c

10
contrib/pyln-testing/pyln/testing/utils.py

@ -732,9 +732,13 @@ class LightningNode(object):
'to CHANNELD_NORMAL']) 'to CHANNELD_NORMAL'])
return scid return scid
def subd_pid(self, subd): def subd_pid(self, subd, peerid=None):
"""Get the process id of the given subdaemon, eg channeld or gossipd""" """Get the process id of the given subdaemon, eg channeld or gossipd"""
ex = re.compile(r'lightning_{}.*: pid ([0-9]*),'.format(subd)) if peerid:
ex = re.compile(r'{}-.*lightning_{}.*: pid ([0-9]*),'
.format(peerid, subd))
else:
ex = re.compile('lightning_{}-.*: pid ([0-9]*),'.format(subd))
# Make sure we get latest one if it's restarted! # Make sure we get latest one if it's restarted!
for l in reversed(self.daemon.logs): for l in reversed(self.daemon.logs):
group = ex.search(l) group = ex.search(l)
@ -1024,7 +1028,7 @@ class NodeFactory(object):
# getpeers. # getpeers.
if not fundchannel: if not fundchannel:
for src, dst in connections: for src, dst in connections:
dst.daemon.wait_for_log('openingd-{} chan #[0-9]*: Handed peer, entering loop'.format(src.info['id'])) dst.daemon.wait_for_log(r'{}-.*lightning_openingd-chan #[0-9]*: Handed peer, entering loop'.format(src.info['id']))
return nodes return nodes
# If we got here, we want to fund channels # If we got here, we want to fund channels

11
lightningd/channel.c

@ -209,14 +209,11 @@ struct channel *new_channel(struct peer *peer, u64 dbid,
if (!log) { if (!log) {
/* FIXME: update log prefix when we get scid */ /* FIXME: update log prefix when we get scid */
/* FIXME: Use minimal unique pubkey prefix for logs! */
const char *idname = type_to_string(peer,
struct node_id,
&peer->id);
channel->log = new_log(channel, channel->log = new_log(channel,
peer->log_book, "%s chan #%"PRIu64":", peer->log_book,
idname, dbid); &channel->peer->id,
tal_free(idname); "chan #%"PRIu64":",
dbid);
} else } else
channel->log = tal_steal(channel, log); channel->log = tal_steal(channel, log);
channel->channel_flags = channel_flags; channel->channel_flags = channel_flags;

2
lightningd/json_stream.c

@ -209,7 +209,7 @@ static struct io_plan *json_stream_output_write(struct io_conn *conn,
js->reader = conn; js->reader = conn;
if (js->log) if (js->log)
log_io(js->log, LOG_IO_OUT, "", p, js->len_read); log_io(js->log, LOG_IO_OUT, NULL, "", p, js->len_read);
return io_write(conn, return io_write(conn,
p, js->len_read, p, js->len_read,
json_stream_output_write, js); json_stream_output_write, js);

8
lightningd/jsonrpc.c

@ -531,7 +531,7 @@ void json_stream_log_suppress_for_cmd(struct json_stream *js,
{ {
const char *nm = cmd->json_cmd->name; const char *nm = cmd->json_cmd->name;
const char *s = tal_fmt(tmpctx, "Suppressing logging of %s command", nm); const char *s = tal_fmt(tmpctx, "Suppressing logging of %s command", nm);
log_io(cmd->jcon->log, LOG_IO_OUT, s, NULL, 0); log_io(cmd->jcon->log, LOG_IO_OUT, NULL, s, NULL, 0);
json_stream_log_suppress(js, strdup(nm)); json_stream_log_suppress(js, strdup(nm));
} }
@ -828,7 +828,7 @@ static struct io_plan *read_json(struct io_conn *conn,
bool valid; bool valid;
if (jcon->len_read) if (jcon->len_read)
log_io(jcon->log, LOG_IO_IN, "", log_io(jcon->log, LOG_IO_IN, NULL, "",
jcon->buffer + jcon->used, jcon->len_read); jcon->buffer + jcon->used, jcon->len_read);
/* Resize larger if we're full. */ /* Resize larger if we're full. */
@ -903,7 +903,7 @@ static struct io_plan *jcon_connected(struct io_conn *conn,
list_head_init(&jcon->commands); list_head_init(&jcon->commands);
/* We want to log on destruction, so we free this in destructor. */ /* We want to log on destruction, so we free this in destructor. */
jcon->log = new_log(ld->log_book, ld->log_book, "%sjcon fd %i:", jcon->log = new_log(ld->log_book, ld->log_book, NULL, "%sjcon fd %i:",
log_prefix(ld->log), io_conn_fd(conn)); log_prefix(ld->log), io_conn_fd(conn));
tal_add_destructor(jcon, destroy_jcon); tal_add_destructor(jcon, destroy_jcon);
@ -1011,7 +1011,7 @@ void jsonrpc_setup(struct lightningd *ld)
ld->jsonrpc = tal(ld, struct jsonrpc); ld->jsonrpc = tal(ld, struct jsonrpc);
strmap_init(&ld->jsonrpc->usagemap); strmap_init(&ld->jsonrpc->usagemap);
ld->jsonrpc->commands = tal_arr(ld->jsonrpc, struct json_command *, 0); ld->jsonrpc->commands = tal_arr(ld->jsonrpc, struct json_command *, 0);
ld->jsonrpc->log = new_log(ld->jsonrpc, ld->log_book, "jsonrpc"); ld->jsonrpc->log = new_log(ld->jsonrpc, ld->log_book, NULL, "jsonrpc");
for (size_t i=0; i<num_cmdlist; i++) { for (size_t i=0; i<num_cmdlist; i++) {
if (!jsonrpc_command_add_perm(ld, ld->jsonrpc, commands[i])) if (!jsonrpc_command_add_perm(ld, ld->jsonrpc, commands[i]))
fatal("Cannot add duplicate command %s", fatal("Cannot add duplicate command %s",

3
lightningd/lightningd.c

@ -169,7 +169,8 @@ static struct lightningd *new_lightningd(const tal_t *ctx)
/*~ Note the tal context arg (by convention, the first argument to any /*~ Note the tal context arg (by convention, the first argument to any
* allocation function): ld->log will be implicitly freed when ld * allocation function): ld->log will be implicitly freed when ld
* is. */ * is. */
ld->log = new_log(ld, ld->log_book, "lightningd(%u):", (int)getpid()); ld->log = new_log(ld, ld->log_book, NULL,
"lightningd(%u):", (int)getpid());
ld->logfile = NULL; ld->logfile = NULL;
/*~ We explicitly set these to NULL: if they're still NULL after option /*~ We explicitly set these to NULL: if they're still NULL after option

76
lightningd/log.c

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

43
lightningd/log.h

@ -13,6 +13,7 @@
struct command; struct command;
struct json_stream; struct json_stream;
struct lightningd; struct lightningd;
struct node_id;
struct timerel; struct timerel;
struct log_entry { struct log_entry {
@ -20,6 +21,7 @@ struct log_entry {
struct timeabs time; struct timeabs time;
enum log_level level; enum log_level level;
unsigned int skipped; unsigned int skipped;
struct node_id *node_id;
const char *prefix; const char *prefix;
char *log; char *log;
/* Iff LOG_IO */ /* Iff LOG_IO */
@ -31,6 +33,7 @@ struct log_book {
size_t max_mem; size_t max_mem;
void (*print)(const char *prefix, void (*print)(const char *prefix,
enum log_level level, enum log_level level,
const struct node_id *node_id,
bool continued, bool continued,
const struct timeabs *time, const struct timeabs *time,
const char *str, const char *str,
@ -50,6 +53,7 @@ struct log_book {
struct log { struct log {
struct log_book *lr; struct log_book *lr;
const struct node_id *default_node_id;
const char *prefix; const char *prefix;
}; };
@ -59,20 +63,33 @@ struct log_book *new_log_book(struct lightningd *ld, size_t max_mem,
enum log_level printlevel); enum log_level printlevel);
/* With different entry points */ /* With different entry points */
struct log *new_log(const tal_t *ctx, struct log_book *record, const char *fmt, ...) PRINTF_FMT(3,4); struct log *new_log(const tal_t *ctx, struct log_book *record,
const struct node_id *default_node_id,
#define log_debug(log, ...) log_((log), LOG_DBG, false, __VA_ARGS__) const char *fmt, ...) PRINTF_FMT(4,5);
#define log_info(log, ...) log_((log), LOG_INFORM, false, __VA_ARGS__)
#define log_unusual(log, ...) log_((log), LOG_UNUSUAL, true, __VA_ARGS__) #define log_debug(log, ...) log_((log), LOG_DBG, NULL, false, __VA_ARGS__)
#define log_broken(log, ...) log_((log), LOG_BROKEN, true, __VA_ARGS__) #define log_info(log, ...) log_((log), LOG_INFORM, NULL, false, __VA_ARGS__)
#define log_unusual(log, ...) log_((log), LOG_UNUSUAL, NULL, true, __VA_ARGS__)
void log_io(struct log *log, enum log_level dir, const char *comment, #define log_broken(log, ...) log_((log), LOG_BROKEN, NULL, true, __VA_ARGS__)
#define log_peer_debug(log, nodeid, ...) log_((log), LOG_DBG, nodeid, false, __VA_ARGS__)
#define log_peer_info(log, nodeid, ...) log_((log), LOG_INFORM, nodeid, false, __VA_ARGS__)
#define log_peer_unusual(log, nodeid, ...) log_((log), LOG_UNUSUAL, nodeid, true, __VA_ARGS__)
#define log_peer_broken(log, nodeid, ...) log_((log), LOG_BROKEN, nodeid, true, __VA_ARGS__)
void log_io(struct log *log, enum log_level dir,
const struct node_id *node_id,
const char *comment,
const void *data, size_t len); const void *data, size_t len);
void log_(struct log *log, enum log_level level, bool call_notifier, const char *fmt, ...) void log_(struct log *log, enum log_level level,
PRINTF_FMT(4,5); const struct node_id *node_id,
bool call_notifier,
const char *fmt, ...)
PRINTF_FMT(5,6);
void log_add(struct log *log, const char *fmt, ...) PRINTF_FMT(2,3); void log_add(struct log *log, const char *fmt, ...) PRINTF_FMT(2,3);
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);
void logv_add(struct log *log, const char *fmt, va_list ap); void logv_add(struct log *log, const char *fmt, va_list ap);
enum log_level get_log_level(struct log_book *lr); enum log_level get_log_level(struct log_book *lr);
@ -86,6 +103,7 @@ struct log_book *get_log_book(const struct log *log);
typesafe_cb_preargs(void, void *, (print), (arg),\ typesafe_cb_preargs(void, void *, (print), (arg),\
const char *, \ const char *, \
enum log_level, \ enum log_level, \
const struct node_id *, \
bool, \ bool, \
const struct timeabs *, \ const struct timeabs *, \
const char *, \ const char *, \
@ -95,6 +113,7 @@ struct log_book *get_log_book(const struct log *log);
void set_log_outfn_(struct log_book *lr, void set_log_outfn_(struct log_book *lr,
void (*print)(const char *prefix, void (*print)(const char *prefix,
enum log_level level, enum log_level level,
const struct node_id *node_id,
bool continued, bool continued,
const struct timeabs *time, const struct timeabs *time,
const char *str, const char *str,
@ -112,6 +131,7 @@ const struct timeabs *log_init_time(const struct log_book *lr);
unsigned int, \ unsigned int, \
struct timerel, \ struct timerel, \
enum log_level, \ enum log_level, \
const struct node_id *, \
const char *, \ const char *, \
const char *, \ const char *, \
const u8 *), (arg)) const u8 *), (arg))
@ -120,6 +140,7 @@ void log_each_line_(const struct log_book *lr,
void (*func)(unsigned int skipped, void (*func)(unsigned int skipped,
struct timerel time, struct timerel time,
enum log_level level, enum log_level level,
const struct node_id *node_id,
const char *prefix, const char *prefix,
const char *log, const char *log,
const u8 *io, const u8 *io,

8
lightningd/log_status.c

@ -1,7 +1,9 @@
#include <common/gen_status_wire.h> #include <common/gen_status_wire.h>
#include <lightningd/log_status.h> #include <lightningd/log_status.h>
bool log_status_msg(struct log *log, const u8 *msg) bool log_status_msg(struct log *log,
const struct node_id *node_id,
const u8 *msg)
{ {
char *entry, *who; char *entry, *who;
u8 *data; u8 *data;
@ -12,12 +14,12 @@ bool log_status_msg(struct log *log, const u8 *msg)
if (level != LOG_IO_IN && level != LOG_IO_OUT) { if (level != LOG_IO_IN && level != LOG_IO_OUT) {
call_notifier = (level == LOG_BROKEN || call_notifier = (level == LOG_BROKEN ||
level == LOG_UNUSUAL)? true : false; level == LOG_UNUSUAL)? true : false;
log_(log, level, call_notifier, "%s", entry); log_(log, level, node_id, call_notifier, "%s", entry);
return true; return true;
} }
} else if (fromwire_status_io(msg, msg, &level, &who, &data)) { } else if (fromwire_status_io(msg, msg, &level, &who, &data)) {
if (level == LOG_IO_IN || level == LOG_IO_OUT) { if (level == LOG_IO_IN || level == LOG_IO_OUT) {
log_io(log, level, who, data, tal_count(data)); log_io(log, level, node_id, who, data, tal_count(data));
return true; return true;
} }
} }

4
lightningd/log_status.h

@ -5,6 +5,8 @@
#include <lightningd/log.h> #include <lightningd/log.h>
/* Returns true (and writes it to log) if it's a status_log message. */ /* Returns true (and writes it to log) if it's a status_log message. */
bool log_status_msg(struct log *log, const u8 *msg); bool log_status_msg(struct log *log,
const struct node_id *node_id,
const u8 *msg);
#endif /* LIGHTNING_LIGHTNINGD_LOG_STATUS_H */ #endif /* LIGHTNING_LIGHTNINGD_LOG_STATUS_H */

7
lightningd/opening_control.c

@ -621,7 +621,6 @@ new_uncommitted_channel(struct peer *peer)
{ {
struct lightningd *ld = peer->ld; struct lightningd *ld = peer->ld;
struct uncommitted_channel *uc = tal(ld, struct uncommitted_channel); struct uncommitted_channel *uc = tal(ld, struct uncommitted_channel);
const char *idname;
uc->peer = peer; uc->peer = peer;
assert(!peer->uncommitted_channel); assert(!peer->uncommitted_channel);
@ -629,10 +628,8 @@ new_uncommitted_channel(struct peer *peer)
uc->transient_billboard = NULL; uc->transient_billboard = NULL;
uc->dbid = wallet_get_channel_dbid(ld->wallet); uc->dbid = wallet_get_channel_dbid(ld->wallet);
idname = type_to_string(uc, struct node_id, &uc->peer->id); uc->log = new_log(uc, uc->peer->log_book, &uc->peer->id,
uc->log = new_log(uc, uc->peer->log_book, "%s chan #%"PRIu64":", "chan #%"PRIu64":", uc->dbid);
idname, uc->dbid);
tal_free(idname);
uc->fc = NULL; uc->fc = NULL;
uc->our_config.id = 0; uc->our_config.id = 0;

5
lightningd/peer_control.c

@ -75,6 +75,7 @@ static void destroy_peer(struct peer *peer)
/* We copy per-peer entries above --log-level into the main log. */ /* We copy per-peer entries above --log-level into the main log. */
static void copy_to_parent_log(const char *prefix, static void copy_to_parent_log(const char *prefix,
enum log_level level, enum log_level level,
const struct node_id *node_id,
bool continued, bool continued,
const struct timeabs *time UNUSED, const struct timeabs *time UNUSED,
const char *str, const char *str,
@ -82,11 +83,11 @@ static void copy_to_parent_log(const char *prefix,
struct log *parent_log) struct log *parent_log)
{ {
if (level == LOG_IO_IN || level == LOG_IO_OUT) if (level == LOG_IO_IN || level == LOG_IO_OUT)
log_io(parent_log, level, prefix, io, io_len); log_io(parent_log, level, node_id, prefix, io, io_len);
else if (continued) else if (continued)
log_add(parent_log, "%s ... %s", prefix, str); log_add(parent_log, "%s ... %s", prefix, str);
else else
log_(parent_log, level, false, "%s %s", prefix, str); log_(parent_log, level, node_id, false, "%s %s", prefix, str);
} }
static void peer_update_features(struct peer *peer, const u8 *features TAKES) static void peer_update_features(struct peer *peer, const u8 *features TAKES)

9
lightningd/plugin.c

@ -37,7 +37,7 @@ struct plugins *plugins_new(const tal_t *ctx, struct log_book *log_book,
p = tal(ctx, struct plugins); p = tal(ctx, struct plugins);
list_head_init(&p->plugins); list_head_init(&p->plugins);
p->log_book = log_book; p->log_book = log_book;
p->log = new_log(p, log_book, "plugin-manager"); p->log = new_log(p, log_book, NULL, "plugin-manager");
p->ld = ld; p->ld = ld;
p->startup = true; p->startup = true;
uintmap_init(&p->pending_requests); uintmap_init(&p->pending_requests);
@ -91,7 +91,7 @@ struct plugin *plugin_register(struct plugins *plugins, const char* path TAKES)
p->used = 0; p->used = 0;
p->subscriptions = NULL; p->subscriptions = NULL;
p->log = new_log(p, plugins->log_book, "plugin-%s", p->log = new_log(p, plugins->log_book, NULL, "plugin-%s",
path_basename(tmpctx, p->cmd)); path_basename(tmpctx, p->cmd));
p->methods = tal_arr(p, const char *, 0); p->methods = tal_arr(p, const char *, 0);
list_head_init(&p->plugin_opts); list_head_init(&p->plugin_opts);
@ -194,7 +194,8 @@ static void plugin_log_handle(struct plugin *plugin, const jsmntok_t *paramstok)
} }
call_notifier = (level == LOG_BROKEN || level == LOG_UNUSUAL)? true : false; call_notifier = (level == LOG_BROKEN || level == LOG_UNUSUAL)? true : false;
log_(plugin->log, level, call_notifier, "%.*s", msgtok->end - msgtok->start, /* FIXME: Let plugin specify node_id? */
log_(plugin->log, level, NULL, call_notifier, "%.*s", msgtok->end - msgtok->start,
plugin->buffer + msgtok->start); plugin->buffer + msgtok->start);
} }
@ -357,7 +358,7 @@ static struct io_plan *plugin_read_json(struct io_conn *conn UNUSED,
{ {
bool success; bool success;
log_io(plugin->log, LOG_IO_IN, "", log_io(plugin->log, LOG_IO_IN, NULL, "",
plugin->buffer + plugin->used, plugin->len_read); plugin->buffer + plugin->used, plugin->len_read);
plugin->used += plugin->len_read; plugin->used += plugin->len_read;

11
lightningd/subd.c

@ -432,7 +432,7 @@ static struct io_plan *sd_msg_read(struct io_conn *conn, struct subd *sd)
switch ((enum status)type) { switch ((enum status)type) {
case WIRE_STATUS_LOG: case WIRE_STATUS_LOG:
case WIRE_STATUS_IO: case WIRE_STATUS_IO:
if (!log_status_msg(sd->log, sd->msg_in)) if (!log_status_msg(sd->log, sd->node_id, sd->msg_in))
goto malformed; goto malformed;
goto next; goto next;
case WIRE_STATUS_FAIL: case WIRE_STATUS_FAIL:
@ -639,10 +639,11 @@ static struct subd *new_subd(struct lightningd *ld,
} }
sd->ld = ld; sd->ld = ld;
if (base_log) { if (base_log) {
sd->log = new_log(sd, get_log_book(base_log), "%s-%s", name, sd->log = new_log(sd, get_log_book(base_log), node_id,
log_prefix(base_log)); "%s-%s", name, log_prefix(base_log));
} else { } else {
sd->log = new_log(sd, ld->log_book, "%s(%u):", name, sd->pid); sd->log = new_log(sd, ld->log_book, node_id,
"%s(%u):", name, sd->pid);
} }
sd->name = name; sd->name = name;
@ -668,7 +669,7 @@ static struct subd *new_subd(struct lightningd *ld,
sd->conn = io_new_conn(ld, msg_fd, msg_setup, sd); sd->conn = io_new_conn(ld, msg_fd, msg_setup, sd);
tal_steal(sd->conn, sd); tal_steal(sd->conn, sd);
log_debug(sd->log, "pid %u, msgfd %i", sd->pid, msg_fd); log_peer_debug(sd->log, node_id, "pid %u, msgfd %i", sd->pid, msg_fd);
/* Clear any old transient message. */ /* Clear any old transient message. */
if (billboardcb) if (billboardcb)

13
lightningd/test/run-find_my_abspath.c

@ -112,7 +112,10 @@ void jsonrpc_setup(struct lightningd *ld UNNEEDED)
struct htlc_in_map *load_channels_from_wallet(struct lightningd *ld UNNEEDED) struct htlc_in_map *load_channels_from_wallet(struct lightningd *ld UNNEEDED)
{ fprintf(stderr, "load_channels_from_wallet called!\n"); abort(); } { fprintf(stderr, "load_channels_from_wallet called!\n"); abort(); }
/* Generated stub for log_ */ /* Generated stub for log_ */
void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED, bool call_notifier UNNEEDED, const char *fmt UNNEEDED, ...) void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED,
const struct node_id *node_id UNNEEDED,
bool call_notifier UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "log_ called!\n"); abort(); } { fprintf(stderr, "log_ called!\n"); abort(); }
/* Generated stub for log_backtrace_exit */ /* Generated stub for log_backtrace_exit */
@ -125,10 +128,14 @@ void log_backtrace_print(const char *fmt UNNEEDED, ...)
const char *log_prefix(const struct log *log UNNEEDED) const char *log_prefix(const struct log *log UNNEEDED)
{ fprintf(stderr, "log_prefix called!\n"); abort(); } { fprintf(stderr, "log_prefix called!\n"); abort(); }
/* Generated stub for log_status_msg */ /* Generated stub for log_status_msg */
bool log_status_msg(struct log *log UNNEEDED, const u8 *msg UNNEEDED) bool log_status_msg(struct log *log UNNEEDED,
const struct node_id *node_id UNNEEDED,
const u8 *msg UNNEEDED)
{ fprintf(stderr, "log_status_msg called!\n"); abort(); } { fprintf(stderr, "log_status_msg called!\n"); abort(); }
/* Generated stub for new_log */ /* Generated stub for new_log */
struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const char *fmt UNNEEDED, ...) struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED,
const struct node_id *default_node_id UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "new_log called!\n"); abort(); } { fprintf(stderr, "new_log called!\n"); abort(); }
/* Generated stub for new_log_book */ /* Generated stub for new_log_book */
struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED, struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED,

14
lightningd/test/run-invoice-select-inchan.c

@ -261,14 +261,19 @@ void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED,
const char *why UNNEEDED) const char *why UNNEEDED)
{ fprintf(stderr, "kill_uncommitted_channel called!\n"); abort(); } { fprintf(stderr, "kill_uncommitted_channel called!\n"); abort(); }
/* Generated stub for log_ */ /* Generated stub for log_ */
void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED, bool call_notifier UNNEEDED, const char *fmt UNNEEDED, ...) void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED,
const struct node_id *node_id UNNEEDED,
bool call_notifier UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "log_ called!\n"); abort(); } { fprintf(stderr, "log_ called!\n"); abort(); }
/* Generated stub for log_add */ /* Generated stub for log_add */
void log_add(struct log *log UNNEEDED, const char *fmt UNNEEDED, ...) void log_add(struct log *log UNNEEDED, const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "log_add called!\n"); abort(); } { fprintf(stderr, "log_add called!\n"); abort(); }
/* Generated stub for log_io */ /* Generated stub for log_io */
void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED, const char *comment UNNEEDED, void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED,
const struct node_id *node_id UNNEEDED,
const char *comment UNNEEDED,
const void *data UNNEEDED, size_t len UNNEEDED) const void *data UNNEEDED, size_t len UNNEEDED)
{ fprintf(stderr, "log_io called!\n"); abort(); } { fprintf(stderr, "log_io called!\n"); abort(); }
/* Generated stub for new_bolt11 */ /* Generated stub for new_bolt11 */
@ -276,7 +281,9 @@ struct bolt11 *new_bolt11(const tal_t *ctx UNNEEDED,
const struct amount_msat *msat TAKES UNNEEDED) const struct amount_msat *msat TAKES UNNEEDED)
{ fprintf(stderr, "new_bolt11 called!\n"); abort(); } { fprintf(stderr, "new_bolt11 called!\n"); abort(); }
/* Generated stub for new_log */ /* Generated stub for new_log */
struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const char *fmt UNNEEDED, ...) struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED,
const struct node_id *default_node_id UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "new_log called!\n"); abort(); } { fprintf(stderr, "new_log called!\n"); abort(); }
/* Generated stub for new_log_book */ /* Generated stub for new_log_book */
struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED, struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNNEEDED,
@ -428,6 +435,7 @@ void plugin_hook_call_(struct lightningd *ld UNNEEDED, const struct plugin_hook
void set_log_outfn_(struct log_book *lr UNNEEDED, void set_log_outfn_(struct log_book *lr UNNEEDED,
void (*print)(const char *prefix UNNEEDED, void (*print)(const char *prefix UNNEEDED,
enum log_level level UNNEEDED, enum log_level level UNNEEDED,
const struct node_id *node_id UNNEEDED,
bool continued UNNEEDED, bool continued UNNEEDED,
const struct timeabs *time UNNEEDED, const struct timeabs *time UNNEEDED,
const char *str UNNEEDED, const char *str UNNEEDED,

13
lightningd/test/run-jsonrpc.c

@ -43,11 +43,16 @@ bool json_to_txid(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED,
struct bitcoin_txid *txid UNNEEDED) struct bitcoin_txid *txid UNNEEDED)
{ fprintf(stderr, "json_to_txid called!\n"); abort(); } { fprintf(stderr, "json_to_txid called!\n"); abort(); }
/* Generated stub for log_ */ /* Generated stub for log_ */
void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED, bool call_notifier UNNEEDED, const char *fmt UNNEEDED, ...) void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED,
const struct node_id *node_id UNNEEDED,
bool call_notifier UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "log_ called!\n"); abort(); } { fprintf(stderr, "log_ called!\n"); abort(); }
/* Generated stub for log_io */ /* Generated stub for log_io */
void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED, const char *comment UNNEEDED, void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED,
const struct node_id *node_id UNNEEDED,
const char *comment UNNEEDED,
const void *data UNNEEDED, size_t len UNNEEDED) const void *data UNNEEDED, size_t len UNNEEDED)
{ fprintf(stderr, "log_io called!\n"); abort(); } { fprintf(stderr, "log_io called!\n"); abort(); }
/* Generated stub for log_prefix */ /* Generated stub for log_prefix */
@ -57,7 +62,9 @@ const char *log_prefix(const struct log *log UNNEEDED)
void memleak_remove_strmap_(struct htable *memtable UNNEEDED, const struct strmap *m UNNEEDED) void memleak_remove_strmap_(struct htable *memtable UNNEEDED, const struct strmap *m UNNEEDED)
{ fprintf(stderr, "memleak_remove_strmap_ called!\n"); abort(); } { fprintf(stderr, "memleak_remove_strmap_ called!\n"); abort(); }
/* Generated stub for new_log */ /* Generated stub for new_log */
struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const char *fmt UNNEEDED, ...) struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED,
const struct node_id *default_node_id UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "new_log called!\n"); abort(); } { fprintf(stderr, "new_log called!\n"); abort(); }
/* Generated stub for new_reltimer_ */ /* Generated stub for new_reltimer_ */
struct oneshot *new_reltimer_(struct timers *timers UNNEEDED, struct oneshot *new_reltimer_(struct timers *timers UNNEEDED,

2
tests/test_closing.py

@ -1459,7 +1459,7 @@ def test_permfail_htlc_out(node_factory, bitcoind, executor):
l2 = node_factory.get_node(disconnect=disconnects, feerates=(7500, 7500, 7500)) l2 = node_factory.get_node(disconnect=disconnects, feerates=(7500, 7500, 7500))
l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l2.daemon.wait_for_log('openingd-{} chan #1: Handed peer, entering loop'.format(l1.info['id'])) l2.daemon.wait_for_log('openingd-chan #1: Handed peer, entering loop'.format(l1.info['id']))
l2.fund_channel(l1, 10**6) l2.fund_channel(l1, 10**6)
# This will fail at l2's end. # This will fail at l2's end.

2
tests/test_connection.py

@ -373,7 +373,7 @@ def test_reconnect_openingd(node_factory):
l1.bitcoin.generate_block(3) l1.bitcoin.generate_block(3)
# Just to be sure, second openingd hand over to channeld. This log line is about channeld being started # Just to be sure, second openingd hand over to channeld. This log line is about channeld being started
l2.daemon.wait_for_log(r'lightning_channeld-[0-9a-f]{66} chan #[0-9]: pid [0-9]+, msgfd [0-9]+') l2.daemon.wait_for_log(r'lightning_channeld-chan #[0-9]: pid [0-9]+, msgfd [0-9]+')
@unittest.skipIf(not DEVELOPER, "needs DEVELOPER=1") @unittest.skipIf(not DEVELOPER, "needs DEVELOPER=1")

6
tests/test_gossip.py

@ -357,7 +357,7 @@ def test_gossip_weirdalias(node_factory, bitcoind):
.format(normal_name)) .format(normal_name))
l1.rpc.connect(l2.info['id'], 'localhost', l2.port) l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l2.daemon.wait_for_log('openingd-{} chan #1: Handed peer, entering loop'.format(l1.info['id'])) l2.daemon.wait_for_log('openingd-chan #1: Handed peer, entering loop')
l2.fund_channel(l1, 10**6) l2.fund_channel(l1, 10**6)
bitcoind.generate_block(6) bitcoind.generate_block(6)
@ -486,8 +486,8 @@ def test_gossip_no_empty_announcements(node_factory, bitcoind):
# Turn on IO logging for openingd (make sure it's ready!) # Turn on IO logging for openingd (make sure it's ready!)
l1.daemon.wait_for_log('openingd-.*: Handed peer, entering loop') l1.daemon.wait_for_log('openingd-.*: Handed peer, entering loop')
subprocess.run(['kill', '-USR1', l1.subd_pid('openingd')]) subprocess.run(['kill', '-USR1', l1.subd_pid('openingd')])
l2.daemon.wait_for_log('openingd-{}.*: Handed peer, entering loop'.format(l3.info['id'])) l2.daemon.wait_for_log(r'{}-.*lightning_openingd-chan #.: Handed peer, entering loop'.format(l3.info['id']))
subprocess.run(['kill', '-USR1', l2.subd_pid('openingd-{}'.format(l3.info['id']))]) subprocess.run(['kill', '-USR1', l2.subd_pid('openingd', l3.info['id'])])
# Make an announced-but-not-updated channel. # Make an announced-but-not-updated channel.
l3.fund_channel(l4, 10**5) l3.fund_channel(l4, 10**5)

4
tests/test_misc.py

@ -1205,7 +1205,7 @@ def test_htlc_send_timeout(node_factory, bitcoind):
timedout = False timedout = False
while not timedout: while not timedout:
try: try:
l2.daemon.wait_for_log(r'channeld-{} chan #[0-9]*:\[IN\] '.format(l3.info['id']), timeout=30) l2.daemon.wait_for_log(r'channeld-chan #[0-9]*:\[IN\] ', timeout=30)
except TimeoutError: except TimeoutError:
timedout = True timedout = True
@ -1231,7 +1231,7 @@ def test_htlc_send_timeout(node_factory, bitcoind):
assert not l2.daemon.is_in_log(r'channeld.*:\[IN\] 0013') assert not l2.daemon.is_in_log(r'channeld.*:\[IN\] 0013')
assert not l2.daemon.is_in_log(r'channeld.*:\[OUT\] 0084') assert not l2.daemon.is_in_log(r'channeld.*:\[OUT\] 0084')
# L2 killed the channel with l3 because it was too slow. # L2 killed the channel with l3 because it was too slow.
l2.daemon.wait_for_log('channeld-{}.*Adding HTLC too slow: killing connection'.format(l3.info['id'])) l2.daemon.wait_for_log('{}-.*lightning_channeld-.*Adding HTLC too slow: killing connection'.format(l3.info['id']))
def test_ipv4_and_ipv6(node_factory): def test_ipv4_and_ipv6(node_factory):

3
tests/test_plugin.py

@ -263,8 +263,7 @@ def test_plugin_connected_hook(node_factory):
l1.daemon.wait_for_log(r"{} is in reject list".format(l3.info['id'])) l1.daemon.wait_for_log(r"{} is in reject list".format(l3.info['id']))
# FIXME: this error occurs *after* connection, so we connect then drop. # FIXME: this error occurs *after* connection, so we connect then drop.
l3.daemon.wait_for_log(r"lightning_openingd-{} chan #1: peer_in WIRE_ERROR" l3.daemon.wait_for_log(r"lightning_openingd-chan #1: peer_in WIRE_ERROR")
.format(l1.info['id']))
l3.daemon.wait_for_log(r"You are in reject list") l3.daemon.wait_for_log(r"You are in reject list")
def check_disconnect(): def check_disconnect():

2
wallet/test/run-db.c

@ -3,7 +3,7 @@
static void db_test_fatal(const char *fmt, ...); static void db_test_fatal(const char *fmt, ...);
#define db_fatal db_test_fatal #define db_fatal db_test_fatal
static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, bool call_notifier UNUSED, const char *fmt UNUSED, ...) static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, const struct node_id *node_id UNUSED, bool call_notifier UNUSED, const char *fmt UNUSED, ...)
{ {
} }
#define log_ db_log_ #define log_ db_log_

9
wallet/test/run-wallet.c

@ -4,7 +4,7 @@ static void wallet_test_fatal(const char *fmt, ...);
#define db_fatal wallet_test_fatal #define db_fatal wallet_test_fatal
#include "test_utils.h" #include "test_utils.h"
static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, bool call_notifier UNUSED, const char *fmt UNUSED, ...) static void db_log_(struct log *log UNUSED, enum log_level level UNUSED, const struct node_id *node_id UNUSED, bool call_notifier UNUSED, const char *fmt UNUSED, ...)
{ {
} }
#define log_ db_log_ #define log_ db_log_
@ -376,7 +376,9 @@ void kill_uncommitted_channel(struct uncommitted_channel *uc UNNEEDED,
void log_add(struct log *log UNNEEDED, const char *fmt UNNEEDED, ...) void log_add(struct log *log UNNEEDED, const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "log_add called!\n"); abort(); } { fprintf(stderr, "log_add called!\n"); abort(); }
/* Generated stub for log_io */ /* Generated stub for log_io */
void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED, const char *comment UNNEEDED, void log_io(struct log *log UNNEEDED, enum log_level dir UNNEEDED,
const struct node_id *node_id UNNEEDED,
const char *comment UNNEEDED,
const void *data UNNEEDED, size_t len UNNEEDED) const void *data UNNEEDED, size_t len UNNEEDED)
{ fprintf(stderr, "log_io called!\n"); abort(); } { fprintf(stderr, "log_io called!\n"); abort(); }
/* Generated stub for notify_connect */ /* Generated stub for notify_connect */
@ -703,7 +705,7 @@ enum log_level get_log_level(struct log_book *lr UNNEEDED)
return LOG_DBG; return LOG_DBG;
} }
struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const char *fmt UNNEEDED, ...) struct log *new_log(const tal_t *ctx UNNEEDED, struct log_book *record UNNEEDED, const struct node_id *default_node_id UNNEEDED, const char *fmt UNNEEDED, ...)
{ {
return NULL; return NULL;
} }
@ -717,6 +719,7 @@ struct log_book *new_log_book(struct lightningd *ld UNNEEDED, size_t max_mem UNN
void set_log_outfn_(struct log_book *lr UNNEEDED, void set_log_outfn_(struct log_book *lr UNNEEDED,
void (*print)(const char *prefix UNNEEDED, void (*print)(const char *prefix UNNEEDED,
enum log_level level UNNEEDED, enum log_level level UNNEEDED,
const struct node_id *node_id UNNEEDED,
bool continued UNNEEDED, bool continued UNNEEDED,
const struct timeabs *time UNNEEDED, const struct timeabs *time UNNEEDED,
const char *str UNNEEDED, const char *str UNNEEDED,

Loading…
Cancel
Save