typedef struct {
char *catname;
- e_xbt_log_priority_t thresh;
char *fmt;
+ e_xbt_log_priority_t thresh;
int additivity;
xbt_log_appender_t appender;
} s_xbt_log_setting_t, *xbt_log_setting_t;
s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = {
NULL /*parent */ , NULL /* firstChild */ , NULL /* nextSibling */ ,
- "root", xbt_log_priority_uninitialized /* threshold */ ,
+ "root",
+ 0 /*initialized */, xbt_log_priority_uninitialized /* threshold */ ,
0 /* isThreshInherited */ ,
NULL /* appender */ , NULL /* layout */ ,
0 /* additivity */
// _XBT_LOGV(log).threshold = xbt_log_priority_debug; /* uncomment to set the LOG category to debug directly */
/* Set logs and init log submodule */
- for (i = 1; i < *argc; i++) {
+ for (j = i = 1; i < *argc; i++) {
if (!strncmp(argv[i], "--log=", strlen("--log=")) ||
!strncmp(argv[i], "--gras-log=", strlen("--gras-log=")) ||
!strncmp(argv[i], "--surf-log=", strlen("--surf-log=")) ||
opt++;
xbt_log_control_set(opt);
XBT_DEBUG("Did apply '%s' as log setting", opt);
- /*remove this from argv */
-
- for (j = i + 1; j < *argc; j++) {
- argv[j - 1] = argv[j];
- }
-
- argv[j - 1] = NULL;
- (*argc)--;
- i--; /* compensate effect of next loop incrementation */
+ } else {
+ argv[j++] = argv[i];
}
}
+ if (j < *argc) {
+ argv[j] = NULL;
+ *argc = j;
+ }
}
static void log_cat_exit(xbt_log_category_t cat)
xbt_os_rmutex_acquire(log_cat_init_mutex);
}
- if (category->threshold != xbt_log_priority_uninitialized) {
+ if (category->initialized) {
if (log_cat_init_mutex != NULL) {
xbt_os_rmutex_release(log_cat_init_mutex);
}
if (category == &_XBT_LOGV(XBT_LOG_ROOT_CAT)) {
category->threshold = xbt_log_priority_info;
- /* xbt_log_priority_debug */ ;
category->appender = xbt_log_default_appender;
category->layout = xbt_log_default_layout;
} else {
XBT_DEBUG("Set %s (%s) as father of %s ",
category->parent->name,
- (category->parent->threshold == xbt_log_priority_uninitialized ?
- "uninited" : xbt_log_priority_names[category->
- parent->threshold]),
+ (category->parent->initialized ?
+ xbt_log_priority_names[category->parent->threshold] : "uninited"),
category->name);
xbt_log_parent_set(category, category->parent);
}
/* Apply the control */
- if (!xbt_log_settings) {
- if (log_cat_init_mutex != NULL) {
- xbt_os_rmutex_release(log_cat_init_mutex);
+ if (xbt_log_settings) {
+ xbt_assert(category, "NULL category");
+ xbt_assert(category->name);
+
+ xbt_dynar_foreach(xbt_log_settings, cursor, setting) {
+ xbt_assert(setting, "Damnit, NULL cat in the list");
+ xbt_assert(setting->catname, "NULL setting(=%p)->catname",
+ (void *) setting);
+
+ if (!strcmp(setting->catname, category->name)) {
+ found = 1;
+ _xbt_log_cat_apply_set(category, setting);
+ xbt_dynar_cursor_rm(xbt_log_settings, &cursor);
+ }
}
- return priority >= category->threshold;
- }
-
- xbt_assert(category, "NULL category");
- xbt_assert(category->name);
- xbt_dynar_foreach(xbt_log_settings, cursor, setting) {
- xbt_assert(setting, "Damnit, NULL cat in the list");
- xbt_assert(setting->catname, "NULL setting(=%p)->catname",
- (void *) setting);
-
- if (!strcmp(setting->catname, category->name)) {
-
- found = 1;
-
- _xbt_log_cat_apply_set(category, setting);
-
- xbt_dynar_cursor_rm(xbt_log_settings, &cursor);
- }
+ if (!found)
+ XBT_DEBUG("Category '%s': inherited threshold = %s (=%d)",
+ category->name, xbt_log_priority_names[category->threshold],
+ category->threshold);
}
- if (!found)
- XBT_DEBUG("Category '%s': inherited threshold = %s (=%d)",
- category->name, xbt_log_priority_names[category->threshold],
- category->threshold);
-
+ category->initialized = 1;
if (log_cat_init_mutex != NULL) {
xbt_os_rmutex_release(log_cat_init_mutex);
}
xbt_assert(cat, "NULL category to be given a parent");
xbt_assert(parent, "The parent category of %s is NULL", cat->name);
- /*
- * if the threshold is initialized
- * unlink from current parent
- */
- if (cat->threshold != xbt_log_priority_uninitialized) {
+ /* if the category is initialized, unlink from current parent */
+ if (cat->initialized) {
- xbt_log_category_t *cpp = &parent->firstChild;
+ xbt_log_category_t *cpp = &cat->parent->firstChild;
while (*cpp != cat && *cpp != NULL) {
cpp = &(*cpp)->nextSibling;
parent->firstChild = cat;
- if (parent->threshold == xbt_log_priority_uninitialized) {
-
- _xbt_log_cat_init(parent,
- xbt_log_priority_uninitialized /* ignored */ );
- }
+ if (!parent->initialized)
+ _xbt_log_cat_init(parent, xbt_log_priority_uninitialized /* ignored */ );
cat->threshold = parent->threshold;
{
cat->additivity = additivity;
}
+
+void xbt_log_help(void)
+{
+ printf(
+"Description of the logging output:\n"
+"\n"
+" Threshold configuration: --log=CATEGORY_NAME.thres:PRIORITY_LEVEL\n"
+" CATEGORY_NAME: defined in code with function 'XBT_LOG_NEW_CATEGORY'\n"
+" PRIORITY_LEVEL: the level to print (trace,debug,verbose,info,warning,error,critical)\n"
+" -> trace: enter and return of some functions\n"
+" -> debug: crufty output\n"
+" -> verbose: verbose output for the user wanting more\n"
+" -> info: output about the regular functionning\n"
+" -> warning: minor issue encountered\n"
+" -> error: issue encountered\n"
+" -> critical: major issue encountered\n"
+"\n"
+" Format configuration: --log=CATEGORY_NAME.fmt:OPTIONS\n"
+" OPTIONS may be:\n"
+" -> %%%%: the %% char\n"
+" -> %%n: platform-dependent line separator (LOG4J compatible)\n"
+" -> %%e: plain old space (SimGrid extension)\n"
+"\n"
+" -> %%m: user-provided message\n"
+"\n"
+" -> %%c: Category name (LOG4J compatible)\n"
+" -> %%p: Priority name (LOG4J compatible)\n"
+"\n"
+" -> %%h: Hostname (SimGrid extension)\n"
+" -> %%P: Process name (SimGrid extension)\n"
+" -> %%t: Thread \"name\" (LOG4J compatible -- actually the address of the thread in memory)\n"
+" -> %%i: Process PID (SimGrid extension -- this is a 'i' as in 'i'dea)\n"
+"\n"
+" -> %%F: file name where the log event was raised (LOG4J compatible)\n"
+" -> %%l: location where the log event was raised (LOG4J compatible, like '%%F:%%L' -- this is a l as in 'l'etter)\n"
+" -> %%L: line number where the log event was raised (LOG4J compatible)\n"
+" -> %%M: function name (LOG4J compatible -- called method name here of course).\n"
+" Defined only when using gcc because there is no __FUNCTION__ elsewhere.\n"
+"\n"
+" -> %%b: full backtrace (Called %%throwable in LOG4J). Defined only under windows or when using the GNU libc because\n"
+" backtrace() is not defined elsewhere, and we only have a fallback for windows boxes, not mac ones for example.\n"
+" -> %%B: short backtrace (only the first line of the %%b). Called %%throwable{short} in LOG4J; defined where %%b is.\n"
+"\n"
+" -> %%d: date (UNIX-like epoch)\n"
+" -> %%r: application age (time elapsed since the beginning of the application)\n"
+"\n"
+ );
+}