add time logging support
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 14 Apr 2008 11:30:15 -0700
changeset 2979 3d39dd617b8d
parent 2978 c93e1d0d6916
child 2980 98b75bde4403
add time logging support
src/core/log.cc
src/core/log.h
src/simulator/simulator.cc
--- a/src/core/log.cc	Mon Apr 14 10:40:46 2008 -0700
+++ b/src/core/log.cc	Mon Apr 14 11:30:15 2008 -0700
@@ -18,8 +18,6 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 
-// What about print-list!!!!!!???????
-
 #ifdef NS3_LOG_ENABLE
 
 #include <list>
@@ -36,6 +34,8 @@
 
 namespace ns3 {
 
+LogTimePrinter g_logTimePrinter = 0;
+
 typedef std::list<std::pair <std::string, LogComponent *> > ComponentList;
 typedef std::list<std::pair <std::string, LogComponent *> >::iterator ComponentListI;
 
@@ -173,9 +173,13 @@
                     {
                       level |= LOG_ALL;
                     }
-                  else if (lev == "prefix")
+                  else if (lev == "prefix_func")
                     {
-                      level |= LOG_PREFIX_ALL;
+                      level |= LOG_PREFIX_FUNC;
+                    }
+                  else if (lev == "prefix_time")
+                    {
+                      level |= LOG_PREFIX_TIME;
                     }
                   else if (lev == "level_error")
                     {
@@ -358,13 +362,21 @@
     }
 }
 
-ParameterLogger::ParameterLogger ()
-  : m_itemNumber (0)
+void LogRegisterTimePrinter (LogTimePrinter printer)
+{
+  g_logTimePrinter = printer;
+}
+LogTimePrinter LogGetTimePrinter(void)
+{
+  return g_logTimePrinter;
+}
+
+
+ParameterLogger::ParameterLogger (std::ostream &os)
+  : m_itemNumber (0),
+    m_os (os)
 {}
 
-ParameterLogger g_parameterLogger;
-
-
 } // namespace ns3
 
 #endif // NS3_LOG_ENABLE
--- a/src/core/log.h	Mon Apr 14 10:40:46 2008 -0700
+++ b/src/core/log.h	Mon Apr 14 11:30:15 2008 -0700
@@ -68,9 +68,28 @@
  * ns3::LogComponentDisable functions or with the NS_LOG
  * environment variable.
  */
-#define NS_LOG_COMPONENT_DEFINE(name)                                \
+#define NS_LOG_COMPONENT_DEFINE(name)                           \
   static ns3::LogComponent g_log = ns3::LogComponent (name)
 
+#define APPEND_TIME_PREFIX                                      \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_TIME))                   \
+    {                                                           \
+      LogTimePrinter printer = LogGetTimePrinter ();            \
+      if (printer != 0)                                         \
+        {                                                       \
+          (*printer) (std::clog);                               \
+          std::clog << " ";                                     \
+        }                                                       \
+    }
+
+#define APPEND_FUNC_PREFIX                                      \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC))                   \
+    {                                                           \
+      std::clog << g_log.Name () << ":" <<                      \
+        __FUNCTION__ << "(): ";                                 \
+    }                                                           \
+
+
 /**
  * \ingroup logging
  * \param level the log level
@@ -90,11 +109,8 @@
     {                                                           \
       if (g_log.IsEnabled (level))                              \
         {                                                       \
-          if (g_log.IsEnabled (ns3::LOG_PREFIX_ALL))            \
-            {                                                   \
-              std::clog << g_log.Name () << ":" <<              \
-                __FUNCTION__ << "(): ";                         \
-            }                                                   \
+          APPEND_TIME_PREFIX;                                   \
+          APPEND_FUNC_PREFIX;                                   \
           std::clog << msg << std::endl;                        \
         }                                                       \
     }                                                           \
@@ -133,9 +149,10 @@
     {                                                   \
       if (g_log.IsEnabled (ns3::LOG_PARAM))             \
         {                                               \
+          APPEND_TIME_PREFIX;                           \
           std::clog << g_log.Name () << ":"             \
                     << __FUNCTION__ << "(";             \
-          g_parameterLogger << parameters;              \
+          ParameterLogger (std::clog)  << parameters;   \
           std::clog << ")" << std::endl;                \
         }                                               \
     }                                                   \
@@ -178,10 +195,11 @@
   LOG_LOGIC          = 0x00000040, // control flow tracing within functions
   LOG_LEVEL_LOGIC    = 0x0000007f,
 
-  LOG_ALL            = 0x7fffffff, // print everything
+  LOG_ALL            = 0x3fffffff, // print everything
   LOG_LEVEL_ALL      = LOG_ALL,
 
-  LOG_PREFIX_ALL     = 0x80000000  // prefix all trace prints with function
+  LOG_PREFIX_FUNC    = 0x80000000, // prefix all trace prints with function
+  LOG_PREFIX_TIME    = 0x40000000  // prefix all trace prints with simulation time
 };
 
 /**
@@ -192,6 +210,9 @@
  * Enable the logging output associated with that log component.
  * The logging output can be later disabled with a call
  * to ns3::LogComponentDisable.
+ *
+ * Same as running your program with the NS_LOG environment
+ * variable set as NS_LOG='name=level'
  */
 void LogComponentEnable (char const *name, enum LogLevel level);
 
@@ -200,6 +221,9 @@
  * \ingroup logging
  *
  * Enable the logging output for all registered log components.
+ *
+ * Same as running your program with the NS_LOG environment
+ * variable set as NS_LOG='*=level'
  */
 void LogComponentEnableAll (enum LogLevel level);
 
@@ -228,9 +252,17 @@
  * \ingroup logging
  *
  * Print the list of logging messages available.
+ * Same as running your program with the NS_LOG environment
+ * variable set as NS_LOG=print-list
  */
 void LogComponentPrintList (void);
 
+typedef void (*LogTimePrinter) (std::ostream &os);
+
+void LogRegisterTimePrinter (LogTimePrinter);
+LogTimePrinter LogGetTimePrinter(void);
+
+
 class LogComponent {
 public:
   LogComponent (char const *name);
@@ -250,8 +282,9 @@
 class ParameterLogger : public std::ostream
 {
   int m_itemNumber;
+  std::ostream &m_os;
 public:
-  ParameterLogger ();
+  ParameterLogger (std::ostream &os);
 
   template<typename T>
   ParameterLogger& operator<< (T param)
@@ -259,10 +292,10 @@
     switch (m_itemNumber)
       {
       case 0: // first parameter
-        std::clog << param;
+        m_os << param;
         break;
       default: // parameter following a previous parameter
-        std::clog << ", " << param;
+        m_os << ", " << param;
         break;
       }
     m_itemNumber++;
@@ -270,9 +303,6 @@
   }
 };
 
-extern ParameterLogger g_parameterLogger;
-
-
 } // namespace ns3
 
 #else /* LOG_ENABLE */
--- a/src/simulator/simulator.cc	Mon Apr 14 10:40:46 2008 -0700
+++ b/src/simulator/simulator.cc	Mon Apr 14 11:30:15 2008 -0700
@@ -24,6 +24,7 @@
 
 #include "ns3/ptr.h"
 #include "ns3/assert.h"
+#include "ns3/log.h"
 
 
 #include <math.h>
@@ -48,7 +49,6 @@
 
 namespace ns3 {
 
-
 class SimulatorPrivate : public Object
 {
 public:
@@ -411,12 +411,18 @@
   GetPriv ()->EnableLogTo (filename);
 }
 
+static void
+TimePrinter (std::ostream &os)
+{
+  os << Simulator::Now ();
+}
 
 Ptr<SimulatorPrivate>
 Simulator::GetPriv (void)
 {
   if (m_priv == 0) 
     {
+      LogRegisterTimePrinter (&TimePrinter);
       m_priv = CreateObject<SimulatorPrivate> ();
       Ptr<Scheduler> scheduler = CreateObject<SchedulerMap> ();
       m_priv->SetScheduler (scheduler);