/* 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. */
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
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;
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
*/
-void xbt_log_init(int *argc, char **argv)
-{
+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 */
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);
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
}
/*
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;
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) {
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);
}
}
}
- 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)