logging: Extend log_target with call-back for un-formatted log line

Some targets might not want to receive only an opaque, pre-formatted
string, but rather the unformatted arguments with metadata like
sub-system/level/file/line.  We solve this by introducing a
log_target->output_raw() function pointer.  If a target specifies this
function, it takes precedence over the regular log_target->output()
function.

Change-Id: I9dc9205d70dce9581458e7e9dc2d8a92991897bd
This commit is contained in:
Harald Welte 2016-12-02 13:52:59 +01:00
parent 909cbecbb9
commit d7c0a373ff
2 changed files with 21 additions and 2 deletions

View File

@ -207,13 +207,29 @@ struct log_target {
};
/*! \brief call-back function to be called when the logging framework
* wants to log somethnig.
* wants to log a fully formatted string
* \param[in] target logging target
* \param[in] level log level of currnet message
* \param[in] string the string that is to be written to the log
*/
void (*output) (struct log_target *target, unsigned int level,
const char *string);
/*! \brief alternative call-back function to which the logging
* framework passes the unfortmatted input arguments,
* i.e. bypassing the internal string formatter
* \param[in] target logging target
* \param[in] subsys logging sub-system
* \param[in] level logging level
* \param[in] file soure code file name
* \param[in] line source code file line number
* \param[in] cont continuation of previous statement?
* \param[in] format format string
* \param[in] ap vararg list of printf arguments
*/
void (*raw_output)(struct log_target *target, int subsys,
unsigned int level, const char *file, int line,
int cont, const char *format, va_list ap);
};
/* use the above macros */

View File

@ -385,7 +385,10 @@ void osmo_vlogp(int subsys, int level, const char *file, int line,
* in undefined state. Since _output uses vsnprintf and it may
* be called several times, we have to pass a copy of ap. */
va_copy(bp, ap);
_output(tar, subsys, level, file, line, cont, format, bp);
if (tar->raw_output)
tar->raw_output(tar, subsys, level, file, line, cont, format, bp);
else
_output(tar, subsys, level, file, line, cont, format, bp);
va_end(bp);
}
}