mirror of https://gerrit.osmocom.org/libosmocore
logging: separate the '<000b>' subsys from filename logging
Add a separate flag and API to switch the category-in-hex output: log_set_print_category_hex(). Add log_set_print_filename2() to modify only the print_filename flag. The old log_set_print_filename() function still affects both flags. Explain the rationale in the comment for log_set_print_filename(). There is no need to deprecate log_set_print_filename(); it might cause compiler warnings and break strict builds unnecessarily. Add VTY command 'logging print category-hex (0|1)'. Since there is no VTY command to switch filename output, nothing needs to be adjusted there (a command will be added in a subsequent patch). Change-Id: Iba03a2b7915853c6dccaf6c393c31405320538b4
This commit is contained in:
parent
1ac277dcef
commit
bd7bd3947d
|
@ -220,6 +220,12 @@ enum log_target_type {
|
||||||
LOG_TGT_TYPE_GSMTAP, /*!< GSMTAP network logging */
|
LOG_TGT_TYPE_GSMTAP, /*!< GSMTAP network logging */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*! Whether/how to log the source filename (and line number). */
|
||||||
|
enum log_filename_type {
|
||||||
|
LOG_FILENAME_NONE,
|
||||||
|
LOG_FILENAME_PATH,
|
||||||
|
};
|
||||||
|
|
||||||
/*! structure representing a logging target */
|
/*! structure representing a logging target */
|
||||||
struct log_target {
|
struct log_target {
|
||||||
struct llist_head entry; /*!< linked list */
|
struct llist_head entry; /*!< linked list */
|
||||||
|
@ -238,7 +244,7 @@ struct log_target {
|
||||||
unsigned int use_color:1;
|
unsigned int use_color:1;
|
||||||
/*! should log messages be prefixed with a timestamp? */
|
/*! should log messages be prefixed with a timestamp? */
|
||||||
unsigned int print_timestamp:1;
|
unsigned int print_timestamp:1;
|
||||||
/*! should log messages be prefixed with a filename? */
|
/*! DEPRECATED: use print_filename2 instead. */
|
||||||
unsigned int print_filename:1;
|
unsigned int print_filename:1;
|
||||||
/*! should log messages be prefixed with a category name? */
|
/*! should log messages be prefixed with a category name? */
|
||||||
unsigned int print_category:1;
|
unsigned int print_category:1;
|
||||||
|
@ -301,6 +307,10 @@ struct log_target {
|
||||||
|
|
||||||
/* Should the log level be printed? */
|
/* Should the log level be printed? */
|
||||||
bool print_level;
|
bool print_level;
|
||||||
|
/* Should we print the subsys in hex like '<000b>'? */
|
||||||
|
bool print_category_hex;
|
||||||
|
/* Should we print the source file and line, and in which way? */
|
||||||
|
enum log_filename_type print_filename2;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* use the above macros */
|
/* use the above macros */
|
||||||
|
@ -322,7 +332,9 @@ void log_set_use_color(struct log_target *target, int);
|
||||||
void log_set_print_extended_timestamp(struct log_target *target, int);
|
void log_set_print_extended_timestamp(struct log_target *target, int);
|
||||||
void log_set_print_timestamp(struct log_target *target, int);
|
void log_set_print_timestamp(struct log_target *target, int);
|
||||||
void log_set_print_filename(struct log_target *target, int);
|
void log_set_print_filename(struct log_target *target, int);
|
||||||
|
void log_set_print_filename2(struct log_target *target, enum log_filename_type lft);
|
||||||
void log_set_print_category(struct log_target *target, int);
|
void log_set_print_category(struct log_target *target, int);
|
||||||
|
void log_set_print_category_hex(struct log_target *target, int);
|
||||||
void log_set_print_level(struct log_target *target, int);
|
void log_set_print_level(struct log_target *target, int);
|
||||||
void log_set_log_level(struct log_target *target, int log_level);
|
void log_set_log_level(struct log_target *target, int log_level);
|
||||||
void log_parse_category_mask(struct log_target *target, const char* mask);
|
void log_parse_category_mask(struct log_target *target, const char* mask);
|
||||||
|
|
|
@ -385,13 +385,22 @@ static void _output(struct log_target *target, unsigned int subsys,
|
||||||
goto err;
|
goto err;
|
||||||
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
||||||
}
|
}
|
||||||
if (target->print_filename) {
|
if (target->print_category_hex) {
|
||||||
ret = snprintf(buf + offset, rem, "<%4.4x> %s:%d ",
|
ret = snprintf(buf + offset, rem, "<%4.4x> ", subsys);
|
||||||
subsys, file, line);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
||||||
}
|
}
|
||||||
|
switch (target->print_filename2) {
|
||||||
|
case LOG_FILENAME_NONE:
|
||||||
|
break;
|
||||||
|
case LOG_FILENAME_PATH:
|
||||||
|
ret = snprintf(buf + offset, rem, "%s:%d ", file, line);
|
||||||
|
if (ret < 0)
|
||||||
|
goto err;
|
||||||
|
OSMO_SNPRINTF_RET(ret, rem, offset, len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = vsnprintf(buf + offset, rem, format, ap);
|
ret = vsnprintf(buf + offset, rem, format, ap);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -621,13 +630,30 @@ void log_set_print_extended_timestamp(struct log_target *target, int print_times
|
||||||
target->print_ext_timestamp = print_timestamp;
|
target->print_ext_timestamp = print_timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Enable or disable printing of the filename while logging
|
/*! Use log_set_print_filename2() instead.
|
||||||
|
* Call log_set_print_filename2() with LOG_FILENAME_PATH or LOG_FILENAME_NONE, *as well as* call
|
||||||
|
* log_set_print_category_hex() with the argument passed to this function. This is to mirror legacy
|
||||||
|
* behavior, which combined the category in hex with the filename. For example, if the category-hex
|
||||||
|
* output were no longer affected by log_set_print_filename(), many unit tests (in libosmocore as well as
|
||||||
|
* dependent projects) would fail since they expect the category to disappear along with the filename.
|
||||||
* \param[in] target Log target to be affected
|
* \param[in] target Log target to be affected
|
||||||
* \param[in] print_filename Enable (1) or disable (0) filenames
|
* \param[in] print_filename Enable (1) or disable (0) filenames
|
||||||
*/
|
*/
|
||||||
void log_set_print_filename(struct log_target *target, int print_filename)
|
void log_set_print_filename(struct log_target *target, int print_filename)
|
||||||
{
|
{
|
||||||
target->print_filename = print_filename;
|
log_set_print_filename2(target, print_filename ? LOG_FILENAME_PATH : LOG_FILENAME_NONE);
|
||||||
|
log_set_print_category_hex(target, print_filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! Enable or disable printing of the filename while logging.
|
||||||
|
* \param[in] target Log target to be affected.
|
||||||
|
* \param[in] print_filename An LOG_FILENAME_* enum value.
|
||||||
|
* LOG_FILENAME_NONE omits the source file and line information from logs.
|
||||||
|
* LOG_FILENAME_PATH prints the entire source file path as passed to LOGP macros.
|
||||||
|
*/
|
||||||
|
void log_set_print_filename2(struct log_target *target, enum log_filename_type lft)
|
||||||
|
{
|
||||||
|
target->print_filename2 = lft;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Enable or disable printing of the category name
|
/*! Enable or disable printing of the category name
|
||||||
|
@ -641,6 +667,15 @@ void log_set_print_category(struct log_target *target, int print_category)
|
||||||
target->print_category = print_category;
|
target->print_category = print_category;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! Enable or disable printing of the category number in hex ('<000b>').
|
||||||
|
* \param[in] target Log target to be affected.
|
||||||
|
* \param[in] print_category_hex Enable (1) or disable (0) hex category.
|
||||||
|
*/
|
||||||
|
void log_set_print_category_hex(struct log_target *target, int print_category_hex)
|
||||||
|
{
|
||||||
|
target->print_category_hex = print_category_hex;
|
||||||
|
}
|
||||||
|
|
||||||
/*! Enable or disable printing of the log level name.
|
/*! Enable or disable printing of the log level name.
|
||||||
* \param[in] target Log target to be affected
|
* \param[in] target Log target to be affected
|
||||||
* \param[in] print_catname Enable (1) or disable (0) filenames
|
* \param[in] print_catname Enable (1) or disable (0) filenames
|
||||||
|
@ -723,7 +758,8 @@ struct log_target *log_target_create(void)
|
||||||
/* global settings */
|
/* global settings */
|
||||||
target->use_color = 1;
|
target->use_color = 1;
|
||||||
target->print_timestamp = 0;
|
target->print_timestamp = 0;
|
||||||
target->print_filename = 1;
|
target->print_filename2 = LOG_FILENAME_PATH;
|
||||||
|
target->print_category_hex = true;
|
||||||
|
|
||||||
/* global log level */
|
/* global log level */
|
||||||
target->loglevel = 0;
|
target->loglevel = 0;
|
||||||
|
|
|
@ -203,6 +203,23 @@ DEFUN(logging_prnt_cat,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN(logging_prnt_cat_hex,
|
||||||
|
logging_prnt_cat_hex_cmd,
|
||||||
|
"logging print category-hex (0|1)",
|
||||||
|
LOGGING_STR "Log output settings\n"
|
||||||
|
"Configure log message\n"
|
||||||
|
"Don't prefix each log message\n"
|
||||||
|
"Prefix each log message with category/subsystem nr in hex ('<000b>')\n")
|
||||||
|
{
|
||||||
|
struct log_target *tgt = osmo_log_vty2tgt(vty);
|
||||||
|
|
||||||
|
if (!tgt)
|
||||||
|
return CMD_WARNING;
|
||||||
|
|
||||||
|
log_set_print_category_hex(tgt, atoi(argv[0]));
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN(logging_prnt_level,
|
DEFUN(logging_prnt_level,
|
||||||
logging_prnt_level_cmd,
|
logging_prnt_level_cmd,
|
||||||
"logging print level (0|1)",
|
"logging print level (0|1)",
|
||||||
|
@ -802,6 +819,7 @@ void logging_vty_add_cmds()
|
||||||
install_element_ve(&logging_prnt_timestamp_cmd);
|
install_element_ve(&logging_prnt_timestamp_cmd);
|
||||||
install_element_ve(&logging_prnt_ext_timestamp_cmd);
|
install_element_ve(&logging_prnt_ext_timestamp_cmd);
|
||||||
install_element_ve(&logging_prnt_cat_cmd);
|
install_element_ve(&logging_prnt_cat_cmd);
|
||||||
|
install_element_ve(&logging_prnt_cat_hex_cmd);
|
||||||
install_element_ve(&logging_prnt_level_cmd);
|
install_element_ve(&logging_prnt_level_cmd);
|
||||||
install_element_ve(&logging_set_category_mask_cmd);
|
install_element_ve(&logging_set_category_mask_cmd);
|
||||||
install_element_ve(&logging_set_category_mask_old_cmd);
|
install_element_ve(&logging_set_category_mask_old_cmd);
|
||||||
|
@ -819,6 +837,7 @@ void logging_vty_add_cmds()
|
||||||
install_element(CFG_LOG_NODE, &logging_prnt_timestamp_cmd);
|
install_element(CFG_LOG_NODE, &logging_prnt_timestamp_cmd);
|
||||||
install_element(CFG_LOG_NODE, &logging_prnt_ext_timestamp_cmd);
|
install_element(CFG_LOG_NODE, &logging_prnt_ext_timestamp_cmd);
|
||||||
install_element(CFG_LOG_NODE, &logging_prnt_cat_cmd);
|
install_element(CFG_LOG_NODE, &logging_prnt_cat_cmd);
|
||||||
|
install_element(CFG_LOG_NODE, &logging_prnt_cat_hex_cmd);
|
||||||
install_element(CFG_LOG_NODE, &logging_prnt_level_cmd);
|
install_element(CFG_LOG_NODE, &logging_prnt_level_cmd);
|
||||||
install_element(CFG_LOG_NODE, &logging_level_cmd);
|
install_element(CFG_LOG_NODE, &logging_level_cmd);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue