From abf30f5f303c45b81bcfdbac76d492a0b6f582d7 Mon Sep 17 00:00:00 2001 From: Nishant Bansal Date: Mon, 16 Dec 2024 21:12:34 +0530 Subject: [PATCH] lightningd/log: Improve logging to handle multi-line messages Changelog-Added: Improved logging format in `lightningd/log` to handle multi-line messages by unescaping '\n' and logging each line separately. Signed-off-by: Nishant Bansal lightningd/log: Improve log handling Changelog-Added: Improved log handling to save memory. Signed-off-by: Nishant Bansal lightningd/log: Refactor code for logging Changelog-Added: Refactored code for log handling. Signed-off-by: Nishant Bansal --- lightningd/log.c | 54 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/lightningd/log.c b/lightningd/log.c index eb03450f7047..4a5e33e947d2 100644 --- a/lightningd/log.c +++ b/lightningd/log.c @@ -1,6 +1,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -557,23 +558,17 @@ static void maybe_notify_log(struct logger *log, notify_log(log->log_book->ld, l); } -void logv(struct logger *log, enum log_level level, - const struct node_id *node_id, - bool call_notifier, - const char *fmt, va_list ap) +static void add_one_log_entry(struct logger *log, enum log_level level, + const struct node_id *node_id, bool call_notifier, + const char *log_msg) { - int save_errno = errno; struct log_entry *l = new_log_entry(log, level, node_id); - /* This is WARN_UNUSED_RESULT, because everyone should somehow deal - * with OOM, even though nobody does. */ - if (vasprintf(&l->log, fmt, ap) == -1) - abort(); - - size_t log_len = strlen(l->log); + l->log = strdup(log_msg); - /* Sanitize any non-printable characters, and replace with '?' */ - for (size_t i=0; ilog[i] < ' ' || l->log[i] >= 0x7f) l->log[i] = '?'; @@ -584,6 +579,39 @@ void logv(struct logger *log, enum log_level level, if (call_notifier) notify_warning(log->log_book->ld, l); +} + +void logv(struct logger *log, enum log_level level, + const struct node_id *node_id, + bool call_notifier, + const char *fmt, va_list ap) +{ + int save_errno = errno; + char *log_msg = NULL; + const char *unescaped_log; + + /* This is WARN_UNUSED_RESULT, because everyone should somehow deal + * with OOM, even though nobody does. */ + if (vasprintf(&log_msg, fmt, ap) == -1) + abort(); + + /* Nothing to escape: simple copy */ + if (!strchr(log_msg, '\\')) + add_one_log_entry(log, level, node_id, call_notifier, log_msg); + /* If it's weird, unescaping can fail */ + else if ((unescaped_log = json_escape_unescape( + tmpctx, (struct json_escape *)log_msg)) == NULL) + add_one_log_entry(log, level, node_id, call_notifier, log_msg); + else { + char **lines = tal_strsplit(unescaped_log, unescaped_log, "\n", + STR_EMPTY_OK); + /* Split to lines and log them separately. */ + for (size_t i = 0; lines[i]; i++) + add_one_log_entry(log, level, node_id, call_notifier, + lines[i]); + } + + free(log_msg); errno = save_errno; }