X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/865f97c868ce92518b1cf4f23e23bd1b16b7917c..2910fcae936946944e9b4fbc74c77767e7d5c9bd:/src/xbt/log.c diff --git a/src/xbt/log.c b/src/xbt/log.c index 84e40ef695..334d289ebf 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -1,8 +1,7 @@ -/* $Id$ */ - /* log - a generic logging facility in the spirit of log4j */ -/* Copyright (c) 2003-2007 Martin Quinson. All rights reserved. */ +/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -25,6 +24,7 @@ #include "xbt/dynar.h" XBT_PUBLIC_DATA(int) (*xbt_pid) (); +int xbt_log_no_loc = 0; /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */ /** \addtogroup XBT_log * @@ -269,17 +269,17 @@ int main() { xbt_log_control_set("SA.thresh:3"); / * This request is enabled, because WARNING >= INFO. * / - CWARN2(VSS, "Low fuel level."); + CWARN0(VSS, "Low fuel level."); / * This request is disabled, because DEBUG < INFO. * / - CDEBUG2(VSS, "Starting search for nearest gas station."); + CDEBUG0(VSS, "Starting search for nearest gas station."); / * The default category SA inherits its priority from VSS. Thus, the following request is enabled because INFO >= INFO. * / - INFO1("Located nearest gas station."); + INFO0("Located nearest gas station."); / * This request is disabled, because DEBUG < INFO. * / - DEBUG1("Exiting gas station search"); + DEBUG0("Exiting gas station search"); } \endverbatim @@ -463,12 +463,11 @@ This is on our TODO list for quite a while now, but your help would be welcome here, too. - *//*' */ + *//*' */ 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; @@ -507,20 +506,32 @@ const char *xbt_log_priority_names[8] = { s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { NULL /*parent */ , NULL /* firstChild */ , NULL /* nextSibling */ , - "root", xbt_log_priority_uninitialized /* threshold */ , - 0 /* isThreshInherited */ , - NULL /* appender */ , NULL /* layout */ , - 0 /* additivity */ + "root", xbt_log_priority_uninitialized /* threshold */ , + 0 /* isThreshInherited */ , + NULL /* appender */ , NULL /* layout */ , + 0 /* additivity */ }; XBT_LOG_NEW_CATEGORY(xbt, "All XBT categories (simgrid toolbox)"); XBT_LOG_NEW_CATEGORY(surf, "All SURF categories"); XBT_LOG_NEW_CATEGORY(msg, "All MSG categories"); XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories"); +XBT_LOG_NEW_CATEGORY(mc, "All MC categories"); +XBT_LOG_NEW_CATEGORY(bindings, "All bindings categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log, xbt, "Loggings from the logging mechanism itself"); +/* 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; +} + /** @brief Get all logging settings from the command line * * xbt_log_control_set() is called on each string we got from cmd line @@ -530,14 +541,6 @@ void xbt_log_init(int *argc, char **argv) int i, j; char *opt; - /* create the default appender and install it in the root category, - which were already created (damnit. Too slow little beetle) */ - 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_usable = 1; - // _XBT_LOGV(log).threshold = xbt_log_priority_debug; /* uncomment to set the LOG category to debug directly */ /* Set logs and init log submodule */ @@ -551,8 +554,8 @@ void xbt_log_init(int *argc, char **argv) if (strncmp(argv[i], "--log=", strlen("--log="))) WARN2 - ("Option %.*s is deprecated and will disapear in the future. Use --log instead.", - (int) (strchr(argv[i], '=') - argv[i]), argv[i]); + ("Option %.*s is deprecated and will disapear in the future. Use --log instead.", + (int) (strchr(argv[i], '=') - argv[i]), argv[i]); opt = strchr(argv[i], '='); opt++; @@ -590,26 +593,17 @@ static void log_cat_exit(xbt_log_category_t cat) log_cat_exit(child); } -void xbt_log_exit(void) +void xbt_log_postexit(void) { VERB0("Exiting log"); xbt_dynar_free(&xbt_log_settings); log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT)); - _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) { - /* Make sure that the layouts have been malloced */ - 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_usable = 1; - } va_start(ev->ap, fmt); va_start(ev->ap_copy, fmt); @@ -629,85 +623,58 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) va_end(ev->ap); va_end(ev->ap_copy); -#ifdef WIN32 +#ifdef _XBT_WIN32 free(ev->buffer); #endif } +/* NOTE: + * + * The standard logging macros use _XBT_LOG_ISENABLED, which calls + * _xbt_log_cat_init(). Thus, if we want to avoid an infinite + * recursion, we can not use the standard logging macros in + * _xbt_log_cat_init(), and in all functions called from it. + * + * To circumvent the problem, we define the macro_xbt_log_init() as + * (0) for the length of the affected functions, and we do not forget + * to undefine it at the end! + */ + static void _xbt_log_cat_apply_set(xbt_log_category_t category, xbt_log_setting_t setting) { - - s_xbt_log_event_t _log_ev; +#define _xbt_log_cat_init(a, b) (0) 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); - } + DEBUG3("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); - } + DEBUG2("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")); - } + DEBUG2("Apply settings for category '%s': set additivity to %s", + category->name, (setting->additivity ? "on" : "off")); } if (setting->appender) { xbt_log_appender_set(category, setting->appender); if (!category->layout) xbt_log_layout_set(category, xbt_log_layout_simple_new(NULL)); category->additivity = 0; - 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, - "Set %p as appender of category '%s'", - setting->appender, category->name); - } + DEBUG2("Set %p as appender of category '%s'", + setting->appender, category->name); } - +#undef _xbt_log_cat_init } /* @@ -718,26 +685,16 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority) { +#define _xbt_log_cat_init(a, b) (0) + unsigned int cursor; xbt_log_setting_t setting = NULL; int found = 0; - s_xbt_log_event_t _log_ev; - - if (_XBT_LOGV(log).threshold <= xbt_log_priority_debug - && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) { - _log_ev.cat = &_XBT_LOGV(log); - _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, - "Initializing category '%s' (firstChild=%s, nextSibling=%s)", - category->name, - (category->firstChild ? category-> - firstChild->name : "none"), - (category->nextSibling ? category-> - nextSibling->name : "none")); - } + + DEBUG3("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; @@ -749,21 +706,15 @@ int _xbt_log_cat_init(xbt_log_category_t category, if (!category->parent) category->parent = &_XBT_LOGV(XBT_LOG_ROOT_CAT); - if (_XBT_LOGV(log).threshold <= xbt_log_priority_debug - && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) { - _log_ev.lineNum = __LINE__; - _xbt_log_event_log(&_log_ev, "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->name); - } + DEBUG3("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->name); xbt_log_parent_set(category, category->parent); - if (_XBT_LOGV(log).threshold < xbt_log_priority_info - && _XBT_LOGV(log).threshold != xbt_log_priority_uninitialized) { + if (XBT_LOG_ISENABLED(log, xbt_log_priority_debug)) { char *buf, *res = NULL; xbt_log_category_t cpp = category->parent->firstChild; while (cpp) { @@ -777,12 +728,10 @@ int _xbt_log_cat_init(xbt_log_category_t category, cpp = cpp->nextSibling; } - _log_ev.lineNum = __LINE__; - _xbt_log_event_log(&_log_ev, - "Childs of %s: %s; nextSibling: %s", - category->parent->name, res, - (category->parent->nextSibling ? category-> - parent->nextSibling->name : "none")); + DEBUG3("Childs of %s: %s; nextSibling: %s", + category->parent->name, res, + (category->parent->nextSibling ? + category->parent->nextSibling->name : "none")); free(res); } @@ -811,22 +760,14 @@ int _xbt_log_cat_init(xbt_log_category_t category, } } - if (!found && category->threshold <= xbt_log_priority_verbose) { - - _log_ev.cat = &_XBT_LOGV(log); - _log_ev.priority = xbt_log_priority_verbose; - _log_ev.fileName = __FILE__; - _log_ev.functionName = _XBT_FUNCTION; - _log_ev.lineNum = __LINE__; - - _xbt_log_event_log(&_log_ev, - "Category '%s': inherited threshold = %s (=%d)", - category->name, - xbt_log_priority_names[category->threshold], - category->threshold); - } + if (!found) + DEBUG3("Category '%s': inherited threshold = %s (=%d)", + category->name, xbt_log_priority_names[category->threshold], + category->threshold); return priority >= category->threshold; + +#undef _xbt_log_cat_init } void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) @@ -858,7 +799,8 @@ void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) if (parent->threshold == xbt_log_priority_uninitialized) { - _xbt_log_cat_init(parent, xbt_log_priority_uninitialized /* ignored */ ); + _xbt_log_cat_init(parent, + xbt_log_priority_uninitialized /* ignored */ ); } cat->threshold = parent->threshold; @@ -960,7 +902,8 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) *p -= 'a' - 'A'; } } - if (!strcmp(neweq, "ON") || !strcmp(neweq, "YES") || !strcmp(neweq, "1")) { + if (!strcmp(neweq, "ON") || !strcmp(neweq, "YES") + || !strcmp(neweq, "1")) { set->additivity = 1; } else { set->additivity = 0; @@ -982,7 +925,8 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) } else { char buff[512]; snprintf(buff, min(512, eq - dot), "%s", dot + 1); - THROW1(arg_error, 0, "Unknown setting of the log category: '%s'", buff); + THROW1(arg_error, 0, "Unknown setting of the log category: '%s'", + buff); } set->catname = (char *) xbt_malloc(dot - name + 1); @@ -1050,6 +994,11 @@ void xbt_log_control_set(const char *control_string) return; DEBUG1("Parse log settings '%s'", control_string); + /* Special handling of no_loc request, which asks for any file localization to be omitted (for tesh runs) */ + if (!strcmp(control_string, "no_loc")) { + xbt_log_no_loc = 1; + return; + } /* some initialization if this is the first time that this get called */ if (xbt_log_settings == NULL) xbt_log_settings = xbt_dynar_new(sizeof(xbt_log_setting_t), @@ -1069,7 +1018,8 @@ void xbt_log_control_set(const char *control_string) xbt_log_category_t cat = NULL; set = _xbt_log_parse_setting(str); - cat = _xbt_log_cat_searchsub(&_XBT_LOGV(XBT_LOG_ROOT_CAT), set->catname); + cat = + _xbt_log_cat_searchsub(&_XBT_LOGV(XBT_LOG_ROOT_CAT), set->catname); if (cat) { DEBUG0("Apply directly"); @@ -1098,8 +1048,9 @@ void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) void xbt_log_layout_set(xbt_log_category_t cat, xbt_log_layout_t lay) { if (!cat->appender) { - VERB1("No appender to category %s. Setting the file appender as default", - cat->name); + VERB1 + ("No appender to category %s. Setting the file appender as default", + cat->name); xbt_log_appender_set(cat, xbt_log_appender_file_new(NULL)); } if (cat->layout && cat != &_XBT_LOGV(root)) {