--- 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);