src/core/model/log-macros-enabled.h
changeset 10687 1330d4ee94e8
child 10844 a8bccd039255
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/model/log-macros-enabled.h	Sun Mar 23 19:08:54 2014 +0400
@@ -0,0 +1,224 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2006,2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+#ifndef NS3_LOG_MACROS_ENABLED_H
+#define NS3_LOG_MACROS_ENABLED_H
+
+#ifdef NS3_LOG_ENABLE
+
+
+/**
+ * \ingroup logging
+ * Append the simulation time to a log message.
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ */
+#define NS_LOG_APPEND_TIME_PREFIX                               \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_TIME))                   \
+    {                                                           \
+      ns3::LogTimePrinter printer = ns3::LogGetTimePrinter ();  \
+      if (printer != 0)                                         \
+        {                                                       \
+          (*printer)(std::clog);                                \
+          std::clog << " ";                                     \
+        }                                                       \
+    }
+
+/**
+ * \ingroup logging
+ * Append the simulation node id to a log message.
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ */
+#define NS_LOG_APPEND_NODE_PREFIX                               \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE))                   \
+    {                                                           \
+      ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();  \
+      if (printer != 0)                                         \
+        {                                                       \
+          (*printer)(std::clog);                                \
+          std::clog << " ";                                     \
+        }                                                       \
+    }
+
+/**
+ * \ingroup logging
+ * Append the function name to a log message.
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ */
+#define NS_LOG_APPEND_FUNC_PREFIX                               \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC))                   \
+    {                                                           \
+      std::clog << g_log.Name () << ":" <<                      \
+      __FUNCTION__ << "(): ";                                   \
+    }                                                           \
+
+/**
+ * \ingroup logging
+ * Append the log severity level to a log message.
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ */
+#define NS_LOG_APPEND_LEVEL_PREFIX(level)                       \
+  if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL))                  \
+    {                                                           \
+      std::clog << "[" << g_log.GetLevelLabel (level) << "] ";  \
+    }                                                           \
+
+
+#ifndef NS_LOG_APPEND_CONTEXT
+/**
+ * \ingroup logging
+ * Append the node id to a log message.
+ *
+ * This is implemented locally in `.cc` files because
+ * the the relevant variable is only known there.
+ *
+ * Preferred format is something like (assuming the node id is
+ * accessible from `var`:
+ * \code
+ *   if (var)
+ *     {
+ *       std::clog << "[node " << var->GetObject<Node> ()->GetId () << "] ";
+ *     }
+ * \endcode
+ *
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ *
+ */
+#define NS_LOG_APPEND_CONTEXT
+#endif /* NS_LOG_APPEND_CONTEXT */
+
+
+/**
+ * \ingroup logging
+ *
+ * This macro allows you to log an arbitrary message at a specific
+ * log level.
+ *
+ * The log message is expected to be a C++ ostream
+ * message such as "my string" << aNumber << "my oth stream".
+ *
+ * Typical usage looks like:
+ * \code
+ * NS_LOG (LOG_DEBUG, "a number="<<aNumber<<", anotherNumber="<<anotherNumber);
+ * \endcode
+ *
+ * \param level the log level
+ * \param msg the message to log
+ * \internal
+ * Logging implementation macro; should not be called directly.
+ */
+#define NS_LOG(level, msg)                                      \
+  do                                                            \
+    {                                                           \
+      if (g_log.IsEnabled (level))                              \
+        {                                                       \
+          NS_LOG_APPEND_TIME_PREFIX;                            \
+          NS_LOG_APPEND_NODE_PREFIX;                            \
+          NS_LOG_APPEND_CONTEXT;                                \
+          NS_LOG_APPEND_FUNC_PREFIX;                            \
+          NS_LOG_APPEND_LEVEL_PREFIX (level);                   \
+          std::clog << msg << std::endl;                        \
+        }                                                       \
+    }                                                           \
+  while (false)
+
+/**
+ * \ingroup logging
+ *
+ * Output the name of the function.
+ *
+ * This should be used only in static functions; most member functions
+ * should instead use NS_LOG_FUNCTION().
+ */
+#define NS_LOG_FUNCTION_NOARGS()                                \
+  do                                                            \
+    {                                                           \
+      if (g_log.IsEnabled (ns3::LOG_FUNCTION))                  \
+        {                                                       \
+          NS_LOG_APPEND_TIME_PREFIX;                            \
+          NS_LOG_APPEND_NODE_PREFIX;                            \
+          NS_LOG_APPEND_CONTEXT;                                \
+          std::clog << g_log.Name () << ":"                     \
+                    << __FUNCTION__ << "()" << std::endl;       \
+        }                                                       \
+    }                                                           \
+  while (false)
+
+
+/**
+ * \ingroup logging
+ *
+ * If log level LOG_FUNCTION is enabled, this macro will output
+ * all input parameters separated by ", ".
+ *
+ * Typical usage looks like:
+ * \code
+ * NS_LOG_FUNCTION (aNumber<<anotherNumber);
+ * \endcode
+ * And the output will look like:
+ * \code
+ * Component:Function (aNumber, anotherNumber)
+ * \endcode
+ *
+ * To facilitate function tracing, most functions should begin with
+ * (at least) NS_LOG_FUNCTION(this).  Static functions should use
+ * NS_LOG_FUNCTION_NOARGS() instead.
+ *
+ * \param parameters the parameters to output.
+ */
+#define NS_LOG_FUNCTION(parameters)                             \
+  do                                                            \
+    {                                                           \
+      if (g_log.IsEnabled (ns3::LOG_FUNCTION))                  \
+        {                                                       \
+          NS_LOG_APPEND_TIME_PREFIX;                            \
+          NS_LOG_APPEND_NODE_PREFIX;                            \
+          NS_LOG_APPEND_CONTEXT;                                \
+          std::clog << g_log.Name () << ":"                     \
+                    << __FUNCTION__ << "(";                     \
+          ns3::ParameterLogger (std::clog) << parameters;       \
+          std::clog << ")" << std::endl;                        \
+        }                                                       \
+    }                                                           \
+  while (false)
+
+
+/**
+ * \ingroup logging
+ *
+ * Output the requested message unconditionaly.
+ *
+ * \param msg the message to log
+ */
+#define NS_LOG_UNCOND(msg)              \
+  do                                    \
+    {                                   \
+      std::clog << msg << std::endl;    \
+    }                                   \
+  while (false)
+
+
+#endif /* NS3_LOG_ENABLE */
+
+#endif /* NS3_LOG_MACROS_ENABLED_H */