/* create the default appender and install it in the root category, which were already created (damnit. Too slow little beetle) */ void xbt_log_preinit(void) { xbt_log_default_appender = xbt_log_appender_file_new(NULL); 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_cat_init_mutex = xbt_os_rmutex_init(); }
//syntax is <maxsize>:<filename> //If roll is 0, use split files, otherwise, use roll file //For split, replace % in the file by the current count xbt_log_appender_t xbt_log_appender2_file_new(char *arg,int roll) { xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1); if (_XBT_LOGV(smpi).initialized) // HACK to detect if we run in SMPI mode. Relies on MAIN__ source disposition res->do_append = smpi_append2_file; else res->do_append = append2_file; res->free_ = free_append2_; xbt_log_append2_file_t data = xbt_new0(struct xbt_log_append2_file_s, 1); xbt_assert(arg); char* buf=xbt_strdup(arg); char* sep=strchr(buf,':'); xbt_assert(sep>0); data->filename=xbt_strdup(sep+1); *sep='\0'; char *endptr; data->limit=strtol(buf,&endptr,10); xbt_assert(endptr[0]=='\0', "Invalid buffer size: %s", buf); xbt_free(buf); if(roll) data->count=-1; else data->count=0; open_append2_file(data); res->data = data; return res; }
void xbt_log_postexit(void) { XBT_VERB("Exiting log"); xbt_os_rmutex_destroy(log_cat_init_mutex); xbt_dynar_free(&xbt_log_settings); log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT)); }
xbt_log_appender_t xbt_log_appender_file_new(char *arg) { xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1); if (_XBT_LOGV(smpi).initialized) // HACK to detect if we run in SMPI mode. Relies on MAIN__ source disposition res->do_append = smpi_append_file; else res->do_append = append_file; res->free_ = free_; if (arg) res->data = (void *) fopen(arg, "w"); else res->data = (void *) stderr; return res; }
/* * This gets called the first time a category is referenced and performs the * initialization. * Also resets threshold to inherited! */ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority) { #define _xbt_log_cat_init(a, b) (0) if (log_cat_init_mutex != NULL) { xbt_os_rmutex_acquire(log_cat_init_mutex); } if (category->initialized) { if (log_cat_init_mutex != NULL) { xbt_os_rmutex_release(log_cat_init_mutex); } return priority >= category->threshold; } unsigned int cursor; xbt_log_setting_t setting = NULL; int found = 0; XBT_DEBUG("Initializing category '%s' (firstChild=%s, nextSibling=%s)", category->name, (category->firstChild ? category->firstChild->name : "none"), (category->nextSibling ? category->nextSibling->name : "none")); if (category == &_XBT_LOGV(XBT_LOG_ROOT_CAT)) { category->threshold = xbt_log_priority_info; category->appender = xbt_log_default_appender; category->layout = xbt_log_default_layout; } else { if (!category->parent) category->parent = &_XBT_LOGV(XBT_LOG_ROOT_CAT); XBT_DEBUG("Set %s (%s) as father of %s ", category->parent->name, (category->parent->initialized ? xbt_log_priority_names[category->parent->threshold] : "uninited"), category->name); xbt_log_parent_set(category, category->parent); if (XBT_LOG_ISENABLED(log, xbt_log_priority_debug)) { char *buf, *res = NULL; xbt_log_category_t cpp = category->parent->firstChild; while (cpp) { if (res) { buf = bprintf("%s %s", res, cpp->name); free(res); res = buf; } else { res = xbt_strdup(cpp->name); } cpp = cpp->nextSibling; } XBT_DEBUG("Children of %s: %s; nextSibling: %s", category->parent->name, res, (category->parent->nextSibling ? category->parent->nextSibling->name : "none")); free(res); } } /* Apply the control */ 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); } } if (!found) XBT_DEBUG("Category '%s': inherited threshold = %s (=%d)", category->name, xbt_log_priority_names[category->threshold], category->threshold); }