Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix the log hierarchy extraction wrt mc_main, that is not in libsimgrid
[simgrid.git] / src / xbt / log.c
index c560de6..1b9fd48 100644 (file)
@@ -1,12 +1,11 @@
 /* log - a generic logging facility in the spirit of log4j                  */
 
-/* Copyright (c) 2004-2011. The SimGrid Team.
+/* Copyright (c) 2004-2014. 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. */
 
-
 #include <stdarg.h>
 #include <ctype.h>
 #include <stdio.h>              /* snprintf */
@@ -105,13 +104,14 @@ higher about the XBT internals.
 \subsection log_app 1.3 Message appenders
 
 The message appenders are the elements in charge of actually displaying the
-message to the user. For now, only two appenders exist: the default one prints
-stuff on stderr while it is possible to create appenders printing to a specific
-file.
+message to the user. For now, four appenders exist: 
+- the default one prints stuff on stderr 
+- file sends the data to a single file
+- rollfile overwrites the file when the file grows too large
+- splitfile creates new files with a specific maximum size
 
-Other are planed (such as the one sending everything to a remote server,
-or the one using only a fixed amount of lines in a file, and rotating content on
-need). One day, for sure ;)
+Other are planed (such as the one sending everything to a remote server) 
+One day, for sure ;)
 
 \subsection log_lay 1.4 Message layouts
 
@@ -399,6 +399,17 @@ messages. This is done through the <tt>app</tt> keyword. For example,
 \verbatim --log=root.app:file:mylogfile\endverbatim redirects the output
 to the file mylogfile.
 
+For splitfile appender, the format is 
+\verbatim --log=root.app:splitfile:size:mylogfile_%.format\endverbatim
+
+The size is in bytes, and the % wildcard will be replaced by the number of the
+file. If no % is present, it will be appended at the end.
+
+rollfile appender is also available, it can be used as
+\verbatim --log=root.app:rollfile:size:mylogfile\endverbatim
+When the file grows to be larger than the size, it will be emptied and new log 
+events will be sent at its beginning 
+
 Any appender setup this way have its own layout format (simple one by default),
 so you may have to change it too afterward. Moreover, the additivity of the log category
 is also set to false to prevent log event displayed by this appender to "leak" to any other
@@ -421,6 +432,16 @@ The following example resets the additivity of the xbt category to true (which i
     option and specify the max file size. This would be a nice default for
     non-kernel applications.
   - Careful, category names are global variables.
+  - When writing a log format, you often want to use spaces. If you don't
+    protect these spaces, they are used as configuration elements separators.
+    For example, if you want to remove the date from the logs, you want to pass the following 
+    argument on the command line. The outer quotes are here to protect the string from the shell 
+    interpretation while the inner ones are there to prevent simgrid from splitting the string 
+    in several log parameters (that would be invalid).
+    \verbatim --log="'root.fmt:%l: [%p/%c]: %m%n'"\endverbatim
+    Another option is to use the SimGrid-specific format directive \%e for
+    spaces, like in the following.
+    \verbatim --log="root.fmt:%l:%e[%p/%c]:%e%m%n"\endverbatim
 
 \section log_internals 4. Internal considerations
 
@@ -471,11 +492,8 @@ By default, only the root category have an appender, and any other category has
 its additivity set to true. This causes all messages to be logged by the root
 category's appender.
 
-The default appender function currently prints to stderr, and the only other
-existing one writes to the specified file. More would be needed, like the one
-able to send the logs to a remote dedicated server.
-This is on our TODO list for quite a while now, but your help would be
-welcome here, too. */
+The default appender function currently prints to stderr
+*/
 
 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 */
@@ -546,9 +564,6 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(xbt);
   XBT_LOG_CONNECT(graphxml_parse);
   XBT_LOG_CONNECT(log);
-#if HAVE_MMAP
-  XBT_LOG_CONNECT(mm_diff);
-#endif
   XBT_LOG_CONNECT(module);
   XBT_LOG_CONNECT(peer);
   XBT_LOG_CONNECT(replay);
@@ -591,7 +606,6 @@ static void xbt_log_connect_categories(void)
 #endif
 
   /* instr */
-#ifdef HAVE_TRACING
   XBT_LOG_CONNECT(instr);
   XBT_LOG_CONNECT(instr_api);
   XBT_LOG_CONNECT(instr_config);
@@ -607,7 +621,8 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(instr_routing);
   XBT_LOG_CONNECT(instr_sd);
   XBT_LOG_CONNECT(instr_surf);
-#endif
+  XBT_LOG_CONNECT(instr_trace);
+  XBT_LOG_CONNECT(instr_TI_trace);
 
   /* jedule */
 #ifdef HAVE_JEDULE
@@ -620,14 +635,32 @@ static void xbt_log_connect_categories(void)
 #ifdef HAVE_MC
   XBT_LOG_CONNECT(mc);
   XBT_LOG_CONNECT(mc_checkpoint);
+  XBT_LOG_CONNECT(mc_comm_determinism);
   XBT_LOG_CONNECT(mc_compare);
-  XBT_LOG_CONNECT(mc_dpor);
-  XBT_LOG_CONNECT(mc_global);
+  XBT_LOG_CONNECT(mc_diff);
+  XBT_LOG_CONNECT(mc_dwarf);
+  XBT_LOG_CONNECT(mc_hash);
+  XBT_LOG_CONNECT(mc_ignore);
+  XBT_LOG_CONNECT(mcer_ignore);
   XBT_LOG_CONNECT(mc_liveness);
   XBT_LOG_CONNECT(mc_memory);
   XBT_LOG_CONNECT(mc_memory_map);
+  XBT_LOG_CONNECT(mc_page_snapshot);
   XBT_LOG_CONNECT(mc_request);
+  XBT_LOG_CONNECT(mc_safety);
+  XBT_LOG_CONNECT(mc_visited);
+  XBT_LOG_CONNECT(mc_client);
+  XBT_LOG_CONNECT(mc_client_api);
+  XBT_LOG_CONNECT(mc_comm_pattern);
+  XBT_LOG_CONNECT(mc_process);
+  XBT_LOG_CONNECT(mc_protocol);
+  XBT_LOG_CONNECT(mc_RegionSnaphot);
+  XBT_LOG_CONNECT(mc_server);
+  XBT_LOG_CONNECT(mc_state);
 #endif
+  XBT_LOG_CONNECT(mc_global);
+  XBT_LOG_CONNECT(mc_config);
+  XBT_LOG_CONNECT(mc_record);
 
   /* msg */
   XBT_LOG_CONNECT(msg);
@@ -636,7 +669,6 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(msg_io);
   XBT_LOG_CONNECT(msg_kernel);
   XBT_LOG_CONNECT(msg_mailbox);
-  XBT_LOG_CONNECT(msg_new_API);
   XBT_LOG_CONNECT(msg_process);
   XBT_LOG_CONNECT(msg_synchro);
   XBT_LOG_CONNECT(msg_task);
@@ -661,10 +693,10 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(simix_io);
   XBT_LOG_CONNECT(simix_kernel);
   XBT_LOG_CONNECT(simix_network);
-  XBT_LOG_CONNECT(simix_new_api);
   XBT_LOG_CONNECT(simix_process);
-  XBT_LOG_CONNECT(simix_smurf);
+  XBT_LOG_CONNECT(simix_popping);
   XBT_LOG_CONNECT(simix_synchro);
+  XBT_LOG_CONNECT(simix_vm);
 
   /* smpi */
   /* SMPI categories are connected in smpi_global.c */
@@ -675,13 +707,14 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(random);
   XBT_LOG_CONNECT(surf_config);
   XBT_LOG_CONNECT(surf_cpu);
+  XBT_LOG_CONNECT(surf_cpu_cas);
   XBT_LOG_CONNECT(surf_cpu_ti);
+  XBT_LOG_CONNECT(surf_energy);
   XBT_LOG_CONNECT(surf_kernel);
   XBT_LOG_CONNECT(surf_lagrange);
   XBT_LOG_CONNECT(surf_lagrange_dichotomy);
   XBT_LOG_CONNECT(surf_maxmin);
   XBT_LOG_CONNECT(surf_network);
-  XBT_LOG_CONNECT(surf_new_model);
 #ifdef HAVE_GTNETS
   XBT_LOG_CONNECT(surf_network_gtnets);
   XBT_LOG_CONNECT(surf_network_gtnets_interface);
@@ -689,22 +722,23 @@ static void xbt_log_connect_categories(void)
   XBT_LOG_CONNECT(surf_network_gtnets_topology);
 #endif
 #ifdef HAVE_NS3
-  XBT_LOG_CONNECT(surf_network_ns3);
-  XBT_LOG_CONNECT(interface_ns3);
-  XBT_LOG_CONNECT(simulator_ns3);
+  XBT_LOG_CONNECT(ns3);
 #endif
   XBT_LOG_CONNECT(surf_parse);
   XBT_LOG_CONNECT(surf_route);
   XBT_LOG_CONNECT(surf_routing_generic);
   XBT_LOG_CONNECT(surf_route_cluster);
+  XBT_LOG_CONNECT(surf_route_cluster_torus);
   XBT_LOG_CONNECT(surf_route_dijkstra);
+  XBT_LOG_CONNECT(surf_route_fat_tree);
   XBT_LOG_CONNECT(surf_route_floyd);
   XBT_LOG_CONNECT(surf_route_full);
   XBT_LOG_CONNECT(surf_route_none);
   XBT_LOG_CONNECT(surf_route_vivaldi);
   XBT_LOG_CONNECT(surf_storage);
   XBT_LOG_CONNECT(surf_trace);
-  XBT_LOG_CONNECT(surf_workstation);
+  XBT_LOG_CONNECT(surf_vm);
+  XBT_LOG_CONNECT(surf_host);
 
 #endif /* simgrid_EXPORTS */
 }
@@ -1057,7 +1091,7 @@ void xbt_log_threshold_set(xbt_log_category_t cat,
 
 static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string)
 {
-
+  const char *orig_control_string = control_string;
   xbt_log_setting_t set = xbt_new(s_xbt_log_setting_t, 1);
   const char *name, *dot, *eq;
 
@@ -1079,8 +1113,8 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string)
   eq = control_string;
   control_string += strcspn(control_string, " ");
 
-  xbt_assert(*dot == '.' && (*eq == '=' || *eq == ':'),
-              "Invalid control string '%s'", control_string);
+  if(*dot != '.' && (*eq == '=' || *eq == ':'))
+    xbt_die ("Invalid control string '%s'", orig_control_string);
 
   if (!strncmp(dot + 1, "threshold", (size_t) (eq - dot - 1))) {
     int i;
@@ -1100,7 +1134,15 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string)
         break;
       }
     }
-    if (i < xbt_log_priority_infinite) {
+
+    if(i<XBT_LOG_STATIC_THRESHOLD){
+     fprintf(stderr,
+                "Priority '%s' (in setting '%s') is above allowed priority '%s'.\n\n"
+                "Compiling SimGrid with -DNDEBUG forbids the levels 'trace' and 'debug'\n"
+                "while -DNLOG forbids any logging, at any level.",
+             eq + 1, name, xbt_log_priority_names[XBT_LOG_STATIC_THRESHOLD]);
+     exit(1);
+    }else if (i < xbt_log_priority_infinite) {
       set->thresh = (e_xbt_log_priority_t) i;
     } else {
       THROWF(arg_error, 0,
@@ -1133,6 +1175,10 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string)
 
     if (!strncmp(neweq, "file:", 5)) {
       set->appender = xbt_log_appender_file_new(neweq + 5);
+    }else if (!strncmp(neweq, "rollfile:", 9)) {
+               set->appender = xbt_log_appender2_file_new(neweq + 9,1);
+    }else if (!strncmp(neweq, "splitfile:", 10)) {
+               set->appender = xbt_log_appender2_file_new(neweq + 10,0);
     } else {
       THROWF(arg_error, 0, "Unknown appender log type: '%s'", neweq);
     }