basic/log: expose log_dispatch

This is useful when we want to avoid printf formatting on the message.
It's nicer than using log_struct with "%s" as the format, because printf
is slow and with a large message (like from a backtrace) this would require
extra unnecessary memory.

I'm not exposing all the fields in the wrapper: only level and errno.
Those are the most likely to be useful.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-04-21 12:52:54 -04:00
parent ba360bb05c
commit 93484b4790
2 changed files with 22 additions and 6 deletions

View file

@ -553,7 +553,7 @@ static int write_to_journal(
return 1;
}
static int log_dispatch(
int log_dispatch_internal(
int level,
int error,
const char *file,
@ -653,7 +653,7 @@ int log_dump_internal(
if (_likely_(LOG_PRI(level) > log_max_level))
return -error;
return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
}
int log_internalv(
@ -680,7 +680,7 @@ int log_internalv(
vsnprintf(buffer, sizeof(buffer), format, ap);
return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer);
}
int log_internal(
@ -744,7 +744,8 @@ int log_object_internalv(
vsnprintf(b, l, format, ap);
return log_dispatch(level, error, file, line, func, object_field, object, extra_field, extra, buffer);
return log_dispatch_internal(level, error, file, line, func,
object_field, object, extra_field, extra, buffer);
}
int log_object_internal(
@ -788,7 +789,7 @@ static void log_assert(
log_abort_msg = buffer;
log_dispatch(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer);
log_dispatch_internal(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer);
}
noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) {
@ -943,7 +944,7 @@ int log_struct_internal(
if (!found)
return -error;
return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8);
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8);
}
int log_set_target_from_string(const char *e) {

View file

@ -75,6 +75,18 @@ void log_close_console(void);
void log_parse_environment(void);
int log_dispatch_internal(
int level,
int error,
const char *file,
int line,
const char *func,
const char *object_field,
const char *object,
const char *extra,
const char *extra_field,
char *buffer);
int log_internal(
int level,
int error,
@ -167,6 +179,9 @@ void log_assert_failed_return(
int line,
const char *func);
#define log_dispatch(level, error, buffer) \
log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer)
/* Logging with level */
#define log_full_errno(level, error, ...) \
({ \