util: pass the file/line/func information through to the logger

This is useful for debugging, let's pass it through and let the log
handler decide whether to use it or not.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2021-07-22 11:15:34 +10:00
parent b527128c27
commit 7f4c8b8247
3 changed files with 22 additions and 13 deletions

View file

@ -43,6 +43,7 @@ static void
logger_default_log_func(struct logger *logger,
const char *prefix,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format, va_list args)
{
const char *msgtype;
@ -65,22 +66,26 @@ logger_default_log_func(struct logger *logger,
void
log_msg_va(struct logger *logger,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format,
va_list args)
{
if (logger->handler && logger->priority <= priority)
logger->handler(logger, logger->prefix, priority, format, args);
logger->handler(logger, logger->prefix,
priority, file, lineno, func,
format, args);
}
void
log_msg(struct logger *logger,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format, ...)
{
va_list args;
va_start(args, format);
log_msg_va(logger, priority, format, args);
log_msg_va(logger, priority, file, lineno, func, format, args);
va_end(args);
}

View file

@ -41,30 +41,33 @@ enum logger_priority {
typedef void (*logger_log_func_t)(struct logger *logger,
const char *prefix,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format, va_list args);
void
log_msg(struct logger *logger,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format, ...);
void
log_msg_va(struct logger *logger,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format,
va_list args);
/* log helpers. The struct T_ needs to have a field called 'logger' */
#define log_debug(T_, ...) \
log_msg((T_)->logger, LOGGER_DEBUG, __VA_ARGS__)
log_msg((T_)->logger, LOGGER_DEBUG, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define log_info(T_, ...) \
log_msg((T_)->logger, LOGGER_INFO, __VA_ARGS__)
log_msg((T_)->logger, LOGGER_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define log_warn(T_, ...) \
log_msg((T_)->logger, LOGGER_WARN, __VA_ARGS__)
log_msg((T_)->logger, LOGGER_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define log_error(T_, ...) \
log_msg((T_)->logger, LOGGER_ERROR, __VA_ARGS__)
log_msg((T_)->logger, LOGGER_ERROR, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define log_bug(T_, ...) \
log_msg((T_)->logger, LOGGER_ERROR, "bug: " __VA_ARGS__)
log_msg((T_)->logger, LOGGER_ERROR, __FILE__, __LINE__, __func__, "bug: " __VA_ARGS__)
struct logger *
logger_new(const char *prefix, void *user_data);

View file

@ -262,17 +262,18 @@ static void
peck_log_handler(struct logger *logger,
const char *prefix,
enum logger_priority priority,
const char *file, int lineno, const char *func,
const char *format, va_list args)
{
const char *msgtype;
_cleanup_free_ char *msgtype;
switch(priority) {
case LOGGER_DEBUG: msgtype = " "; break;
case LOGGER_INFO: msgtype = "INF"; break;
case LOGGER_WARN: msgtype = "WRN"; break;
case LOGGER_ERROR: msgtype = "ERR"; break;
case LOGGER_DEBUG: msgtype = xaprintf("%3d", lineno); break;
case LOGGER_INFO: msgtype = xstrdup("INF"); break;
case LOGGER_WARN: msgtype = xstrdup("WRN"); break;
case LOGGER_ERROR: msgtype = xstrdup("ERR"); break;
default:
msgtype = "<invalid msgtype>";
msgtype = xstrdup("<invalid msgtype>");
break;
}