X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a9b94bc9be0c3ad5b5f816bf343152a3617a1bc2..8d40d39f472cecd6791a4149b5e89d6d3a17d24d:/src/xbt/log.c diff --git a/src/xbt/log.c b/src/xbt/log.c index b532cb0260..7fda9b9136 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -7,7 +7,9 @@ /* 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. */ + #include +#include "gras_config.h" /* to get a workgin stdarg.h */ #include #include "xbt_modinter.h" @@ -18,14 +20,12 @@ #include "xbt/error.h" #include "xbt/dynar.h" - -/** \defgroup XBT_log Logging support. - * \brief A generic logging facility in the spirit of log4j +/** \addtogroup XBT_log * * This section describes the API to the log functions used * everywhere in this project. -

Overview

+\section log_overview Overview This is an adaptation of the log4c project, which is dead upstream, and which I was given the permission to fork under the LGPL licence by the @@ -37,7 +37,7 @@ concepts work together to enable developers to log messages according to message type and priority, and to control at runtime how these messages are formatted and where they are reported. -

Category hierarchy

+\section log_cat Category hierarchy The first and foremost advantage of any logging API over plain printf() resides in its ability to disable certain log statements while allowing @@ -71,7 +71,9 @@ definition. Typically, there will be a Category for each module and sub-module, so you can independently control logging for each module. -

Priority

+For a list of all existing categories, please refer to the \ref XBT_log_cats section. + +\section log_pri Priority A category may be assigned a threshold priorty. The set of priorites are defined by the \ref e_xbt_log_priority_t enum. All logging request under @@ -110,7 +112,7 @@ equivalent to the shorter: CWARN4(MyCat, "Values are: %d and '%s'", 5, "oops"); -

Default category

+\subsection log_subcat Using a default category If \ref XBT_LOG_NEW_DEFAULT_SUBCATEGORY(MyCat, Parent) or \ref XBT_LOG_NEW_DEFAULT_CATEGORY(MyCat) is used to create the @@ -121,7 +123,7 @@ category, then the even shorter form can be used: Only one default category can be created per file, though multiple non-defaults can be created and used. -

Example

+\section log_example Example Here is a more complete example: @@ -151,7 +153,7 @@ int main() { } \endverbatim -

Configuration

+\section log_conf Configuration Configuration is typically done during program initialization by invoking the xbt_log_control_set() method. The control string passed to it typically comes from the command line. Look at the documentation for that function for @@ -162,7 +164,7 @@ Any SimGrid program can furthermore be configured at run time by passing a --surf-log are synonyms). You can provide several of those arguments to change the setting of several categories. -

Performance

+\section log_perf Performance Clever design insures efficiency. Except for the first invocation, a disabled logging request requires an a single comparison of a static @@ -174,8 +176,12 @@ by the compiler. By setting it to gras_log_priority_infinite, all logging requests are statically disabled and cost nothing. Released executables might be compiled with \verbatim-DXBT_LOG_STATIC_THRESHOLD=gras_log_priority_infinite\endverbatim - -

Appenders

+ +Compiling with the \verbatim-DNLOG\endverbatim option disables all logging +requests at compilation time while the \verbatim-DNDEBUG\endverbatim disables +the requests of priority below INFO. + +\section log_app Appenders Each category has an optional appender. An appender is a pointer to a structure which starts with a pointer to a doAppend() function. DoAppend() @@ -199,108 +205,19 @@ remote dedicated server, or other ones offering different output formats. This is on our TODO list for quite a while now, but your help would be welcome here. -

Misc and Caveats

- -Do not use any of the macros that start with '_'. +\section log_misc Misc and Caveats -Log4J has a 'rolling file appender' which you can select with a run-time -option and specify the max file size. This would be a nice default for -non-kernel applications. - -Careful, category names are global variables. + - Do not use any of the macros that start with '_'. + - Log4J has a 'rolling file appender' which you can select with a run-time + option and specify the max file size. This would be a nice default for + non-kernel applications. + - Careful, category names are global variables. */ /* FAIRE DES ZOLIS LOGS -------------------- -Dans gras, tu ne te contente pas d'écrire des choses à l'écran, mais tu -écris sur un sujet particulier (notion de canal) des choses d'une gravité -particulière. Il y a 7 niveaux de gravité. - trace: tracer les entrées dans une fonction, retour de fonction - (famille de macros XBT_IN/XBT_OUT) - debug: pour t'aider à mettre au point le module, potentiellement tres bavard - verbose: quelques infos succintes sur les internals du module - info: niveau normal, ton de la conversation - warning: problème potentiel, mais auquel on a su faire face - error: problème qui t'as empêché de faire ton job - critical: juste avant de mourir - -Quand on compile avec -DNDEBUG (par défaut dans le paquet Debian), tout ce -qui est '>= verbose' est supprimé au moment de la compilation. Retiré du -binaire, killé. - -Ensuite, tu écris dans un canal particulier. Tous les canaux sont rangés en -arbre. Il faudrait faire un ptit script qui fouille les sources à la -recherche des macros XBT_LOG_NEW_* utilisées pour créer des canaux. Le -dernier argument de ces macros est ignoré dans le source. Il est destiné à -être la documentation de la chose en une ligne. En gros, ca fait: -root - +--xbt - | +--config - | +--dict - | | +--dict_cursor - | | +--dict_elm - | | ... - | +--dynar - | +--set - | +--log - | +--module - +--gras - +--datadesc - | +--ddt_cbps - | +--ddt_convert - | +--ddt_exchange - | +--ddt_parse - | +--lexer - +--msg - +--transport - +--raw_trp (Je devrais tuer ce module, un jour) - +--trp_buf - +--trp_sg - +--trp_file - +--trp_tcp - -Et ensuite les utilisateurs peuvent choisir le niveau de gravité qui les -interresse sur tel ou tel sujet. - -Toute la mécanique de logging repose sur des variables statiques dont le nom -dépend du nom du canal. - => attention aux conflits de nom de canal - => il faut une macro XBT_LOG dans chaque fichier où tu fais des logs. - -XBT_LOG_NEW_CATEGORY: nouveau canal sous "root". Rare, donc. -XBT_LOG_NEW_SUBCATEGORY: nouveau canal dont on précise le père. -XBT_LOG_DEFAULT_CATEGORY: indique quel est le canal par défaut dans ce fichier -XBT_LOG_NEW_DEFAULT_CATEGORY: Crèe un canal et l'utilise par défaut -XBT_LOG_NEW_DEFAULT_SUBCATEGORY: devine -XBT_LOG_EXTERNAL_CATEGORY: quand tu veux utiliser par défaut un canal créé - dans un autre fichier. - -Une fois que ton canal est créé, tu l'utilise avec les macros LOG, DEBUG, -VERB, WARN, ERROR et CRITICAL. Il faut que tu donne le nombre d'arguments -après le nom de macro. Exemple: LOG2("My name is %s %s","Martin","Quinson") -Si tu veux préciser explicitement le canal où écrire, ajoute un C devant le -nom de la macro. Exemple: CCRITICAL0(module, "Cannot initialize GRAS") - -Toutes ces macros (enfin, ce en quoi elles se réécrivent) vérifient leurs -arguments comme printf le fait lorsqu'on compile avec gcc. -LOG1("name: %d","toto"); donne un warning, et donc une erreur en mode -mainteneur. - -Enfin, tu peux tester si un canal est ouvert à une priorité donnée (pour -préparer plus de débug, par exemple. Dans le parseur, je fais du pretty -printing sur ce qu'il faut parser dans ce cas). -XBT_LOG_ISENABLED(catName, priority) Le second argument doit être une valeur -de e_xbt_log_priority_t (log.h). Par exemple: xbt_log_priority_verbose - -Voila sur comment mettre des logs dans ton code. N'hesite pas à faire pleins -de canaux différents pour des aspects différents de ton code. En -particulier, dans les dict, j'ai un canal pour l'ajout, le retrait, le -netoyage du code après suppression et ainsi de suite. De cette façon, je -peux choisir qui m'interresse. - - Pour utiliser les logs, tu déjà faire, non ? Tu colle sur la ligne de commande un ou plusieurs arguments de la forme --gras-log=" [+]" (ou sans " si t'as pas d'espace) @@ -320,8 +237,8 @@ static xbt_dynar_t xbt_log_settings=NULL; static void _free_setting(void *s) { xbt_log_setting_t set=(xbt_log_setting_t)s; if (set) { - xbt_free(set->catname); -/* xbt_free(set); FIXME: uncommenting this leads to segfault when more than one chunk is passed as gras-log */ + free(set->catname); +/* free(set); FIXME: uncommenting this leads to segfault when more than one chunk is passed as gras-log */ } } @@ -342,22 +259,21 @@ s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { NULL, 0 }; -XBT_LOG_NEW_SUBCATEGORY(xbt,XBT_LOG_ROOT_CAT,"All XBT categories (simgrid toolbox)"); -XBT_LOG_NEW_SUBCATEGORY(surf,XBT_LOG_ROOT_CAT,"All SURF categories"); -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mecanism itself"); +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_DEFAULT_SUBCATEGORY(log,xbt,"Loggings from the logging mechanism itself"); -void xbt_log_init(int *argc,char **argv, const char *defaultlog) { +void xbt_log_init(int *argc,char **argv) { int i,j; char *opt; - int found=0; - /** Set logs and init log submodule */ + /* Set logs and init log submodule */ for (i=1; i<*argc; i++) { if (!strncmp(argv[i],"--gras-log=",strlen("--gras-log=")) || !strncmp(argv[i],"--surf-log=",strlen("--surf-log=")) || !strncmp(argv[i],"--msg-log=",strlen("--msg-log=")) || !strncmp(argv[i],"--xbt-log=",strlen("--xbt-log="))) { - found = 1; opt=strchr(argv[i],'='); opt++; xbt_log_control_set(opt); @@ -371,9 +287,6 @@ void xbt_log_init(int *argc,char **argv, const char *defaultlog) { i--; /* compensate effect of next loop incrementation */ } } - if (!found && defaultlog) { - xbt_log_control_set(defaultlog); - } } void xbt_log_exit(void) { @@ -403,9 +316,9 @@ static void _apply_control(xbt_log_category_t cat) { xbt_log_threshold_set(cat, setting->thresh); xbt_dynar_cursor_rm(xbt_log_settings,&cursor); - if (cat->threshold <= xbt_log_priority_verbose) { + if (cat->threshold <= xbt_log_priority_debug) { s_xbt_log_event_t _log_ev = - {cat,xbt_log_priority_verbose,__FILE__,_XBT_GNUC_FUNCTION,__LINE__}; + {cat,xbt_log_priority_debug,__FILE__,_XBT_GNUC_FUNCTION,__LINE__}; _xbt_log_event_log(&_log_ev, "Apply settings for category '%s': set threshold to %s (=%d)", cat->name, @@ -557,7 +470,7 @@ static void _xbt_log_parse_setting(const char* control_string, } else { xbt_assert1(FALSE,"Unknown priority name: %s",eq+1); } - xbt_free(neweq); + free(neweq); } else { char buff[512]; snprintf(buff,min(512,eq - dot - 1),"%s",dot+1); @@ -678,12 +591,12 @@ void xbt_log_control_set(const char* control_string) { set = xbt_new(s_xbt_log_setting_t,1); } else { DEBUG0("Apply directly"); - xbt_free(set->catname); + free(set->catname); xbt_log_threshold_set(cat,set->thresh); } } - xbt_free(set); - xbt_free(cs); + free(set); + free(cs); } void xbt_log_appender_set(xbt_log_category_t cat, xbt_log_appender_t app) {