process identity (thus, fmt is '[%r] %l: [%c/%p] %m%n' in that case, and '[%r]
[%c/%p] %m%n' if they are at priority INFO).
+For now, there is only one format modifyier: the precision field. You can for
+example specify %.4r to get the application age with 4 numbers after the radix.
+
\subsection log_hist 1.5 History of this module
Historically, this module is an adaptation of the log4c project, which is dead
welcome here, too.
-*/
+*//*'*/
\f
xbt_log_appender_t xbt_log_default_appender = NULL; /* set in log_init */
xbt_log_layout_t xbt_log_default_layout = NULL; /* set in log_init */
+int _log_usable = 0;
typedef struct {
char *catname;
free(set);
}
}
+static void _xbt_log_cat_apply_set(xbt_log_category_t category,
+ xbt_log_setting_t setting);
const char *xbt_log_priority_names[8] = {
"NONE",
xbt_log_default_layout = xbt_log_layout_simple_new(NULL);
_XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender;
_XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout;
+ _log_usable = 1;
/* Set logs and init log submodule */
for (i=1; i<*argc; i++){
VERB0("Exiting log");
xbt_dynar_free(&xbt_log_settings);
log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT));
- VERB0("Exited log");
+ _log_usable = 0;
}
void _xbt_log_event_log( xbt_log_event_t ev, const char *fmt, ...) {
xbt_log_category_t cat = ev->cat;
-
+ if (!_log_usable) {
+ fprintf(stderr,"XXXXXXXXXXXXXXXXXXX\nXXX Warning, logs not usable here. Either before xbt_init() or after xbt_exit().\nXXXXXXXXXXXXXXXXXXX\n");
+ va_start(ev->ap, fmt);
+ vfprintf(stderr,fmt,ev->ap);
+ va_end(ev->ap);
+ xbt_backtrace_display();
+ return;
+ }
+
va_start(ev->ap, fmt);
while(1) {
xbt_log_appender_t appender = cat->appender;
va_end(ev->ap);
}
+static void _xbt_log_cat_apply_set(xbt_log_category_t category,
+ xbt_log_setting_t setting) {
+
+ s_xbt_log_event_t _log_ev;
+
+ if (setting->thresh != xbt_log_priority_uninitialized) {
+ xbt_log_threshold_set(category, setting->thresh);
+
+ if (category->threshold <= xbt_log_priority_debug) {
+ _log_ev.cat = category;
+ _log_ev.priority = xbt_log_priority_debug;
+ _log_ev.fileName = __FILE__ ;
+ _log_ev.functionName = _XBT_FUNCTION ;
+ _log_ev.lineNum = __LINE__ ;
+
+ _xbt_log_event_log(&_log_ev,
+ "Apply settings for category '%s': set threshold to %s (=%d)",
+ category->name,
+ xbt_log_priority_names[category->threshold],
+ category->threshold);
+ }
+ }
+
+ if (setting->fmt) {
+ xbt_log_layout_set(category,xbt_log_layout_format_new(setting->fmt));
+
+ if (category->threshold <= xbt_log_priority_debug) {
+ _log_ev.cat = category;
+ _log_ev.priority = xbt_log_priority_debug;
+ _log_ev.fileName = __FILE__ ;
+ _log_ev.functionName = _XBT_FUNCTION ;
+ _log_ev.lineNum = __LINE__ ;
+
+ _xbt_log_event_log(&_log_ev,
+ "Apply settings for category '%s': set format to %s",
+ category->name,
+ setting->fmt);
+ }
+ }
+
+ if (setting->additivity != -1) {
+ xbt_log_additivity_set(category,setting->additivity);
+
+ if (category->threshold <= xbt_log_priority_debug) {
+ _log_ev.cat = category;
+ _log_ev.priority = xbt_log_priority_debug;
+ _log_ev.fileName = __FILE__ ;
+ _log_ev.functionName = _XBT_FUNCTION ;
+ _log_ev.lineNum = __LINE__ ;
+
+ _xbt_log_event_log(&_log_ev,
+ "Apply settings for category '%s': set additivity to %s",
+ category->name,
+ (setting->additivity?"on":"off"));
+ }
+ }
+}
/*
* This gets called the first time a category is referenced and performs the
* initialization.
found = 1;
- if (setting->thresh != xbt_log_priority_uninitialized) {
- xbt_log_threshold_set(category, setting->thresh);
-
- if (category->threshold <= xbt_log_priority_debug) {
- _log_ev.cat = category;
- _log_ev.priority = xbt_log_priority_debug;
- _log_ev.fileName = __FILE__ ;
- _log_ev.functionName = _XBT_FUNCTION ;
- _log_ev.lineNum = __LINE__ ;
-
- _xbt_log_event_log(&_log_ev,
- "Apply settings for category '%s': set threshold to %s (=%d)",
- category->name,
- xbt_log_priority_names[category->threshold],
- category->threshold);
- }
- }
-
- if (setting->fmt) {
- xbt_log_layout_set(category,xbt_log_layout_format_new(setting->fmt));
-
- if (category->threshold <= xbt_log_priority_debug) {
- _log_ev.cat = category;
- _log_ev.priority = xbt_log_priority_debug;
- _log_ev.fileName = __FILE__ ;
- _log_ev.functionName = _XBT_FUNCTION ;
- _log_ev.lineNum = __LINE__ ;
-
- _xbt_log_event_log(&_log_ev,
- "Apply settings for category '%s': set format to %s",
- category->name,
- setting->fmt);
- }
- }
-
- if (setting->additivity != -1) {
- xbt_log_additivity_set(category,setting->additivity);
-
- if (category->threshold <= xbt_log_priority_debug) {
- _log_ev.cat = category;
- _log_ev.priority = xbt_log_priority_debug;
- _log_ev.fileName = __FILE__ ;
- _log_ev.functionName = _XBT_FUNCTION ;
- _log_ev.lineNum = __LINE__ ;
-
- _xbt_log_event_log(&_log_ev,
- "Apply settings for category '%s': set additivity to %s",
- category->name,
- (setting->additivity?"on":"off"));
- }
- }
+ _xbt_log_cat_apply_set(category,setting);
xbt_dynar_cursor_rm(xbt_log_settings,&cursor);
}
_xbt_log_event_log(&_log_ev,
"Category '%s': inherited threshold = %s (=%d)",
category->name,
- xbt_log_priority_names[category->threshold], category->threshold);
+ xbt_log_priority_names[category->threshold], category->threshold);
}
return priority >= category->threshold;
static void _set_inherited_thresholds(xbt_log_category_t cat) {
-
xbt_log_category_t child = cat->firstChild;
for( ; child != NULL; child = child->nextSibling) {
/* split the string, and remove empty entries */
set_strings=xbt_str_split_quoted(control_string);
-#ifdef FIXME
- xbt_dynar_foreach(set_strings,cpt,str) {
- xbt_str_trim(str,NULL);
- if (str[0]=='\0') {
- xbt_dynar_cursor_rm(set_strings,&cpt);
- }
- }
-#endif
if (xbt_dynar_length(set_strings) == 0) { /* vicious user! */
xbt_dynar_free(&set_strings);
if (found) {
DEBUG0("Apply directly");
- xbt_log_threshold_set(cat,set->thresh);
+ _xbt_log_cat_apply_set(cat,set);
_free_setting((void*)&set);
} else {
cat->name);
xbt_log_appender_set(cat,xbt_log_appender_file_new(NULL));
}
- if (cat->layout) {
+ if (cat->layout && cat != &_XBT_LOGV(root)) {
+ /* better leak the default layout than check every categories to
+ change it */
if (cat->layout->free_) {
cat->layout->free_(cat->layout);
free(cat->layout);