26 #include "ns3/core-config.h"
27 #include "fatal-error.h"
39 LogTimePrinter g_logTimePrinter = 0;
40 LogNodePrinter g_logNodePrinter = 0;
42 typedef std::list<std::pair <std::string, LogComponent *> > ComponentList;
43 typedef std::list<std::pair <std::string, LogComponent *> >::iterator ComponentListI;
52 ComponentList *GetComponentList (
void)
54 static ComponentList components;
60 PrintList::PrintList ()
63 char *envVar = getenv (
"NS_LOG");
68 std::string env = envVar;
69 std::string::size_type cur = 0;
70 std::string::size_type next = 0;
71 while (next != std::string::npos)
73 next = env.find_first_of (
":", cur);
74 std::string tmp = std::string (env, cur, next-cur);
75 if (tmp ==
"print-list")
87 LogComponent::LogComponent (
char const * name)
88 : m_levels (0), m_name (name)
92 ComponentList *components = GetComponentList ();
93 for (ComponentListI i = components->begin ();
94 i != components->end ();
99 NS_FATAL_ERROR (
"Log component \""<<name<<
"\" has already been registered once.");
102 components->push_back (std::make_pair (name,
this));
106 LogComponent::EnvVarCheck (
char const * name)
109 char *envVar = getenv (
"NS_LOG");
114 std::string env = envVar;
115 std::string myName = name;
117 std::string::size_type cur = 0;
118 std::string::size_type next = 0;
119 while (next != std::string::npos)
121 next = env.find_first_of (
":", cur);
122 std::string tmp = std::string (env, cur, next-cur);
123 std::string::size_type equal = tmp.find (
"=");
124 std::string component;
125 if (equal == std::string::npos)
128 if (component == myName || component ==
"*")
130 int level = LOG_LEVEL_ALL | LOG_PREFIX_ALL;
131 Enable ((
enum LogLevel)level);
137 component = tmp.substr (0, equal);
138 if (component == myName || component ==
"*")
141 std::string::size_type cur_lev;
142 std::string::size_type next_lev = equal;
143 bool pre_pipe =
true;
146 cur_lev = next_lev + 1;
147 next_lev = tmp.find (
"|", cur_lev);
148 std::string lev = tmp.substr (cur_lev, next_lev - cur_lev);
153 else if (lev ==
"warn")
157 else if (lev ==
"debug")
161 else if (lev ==
"info")
165 else if (lev ==
"function")
167 level |= LOG_FUNCTION;
169 else if (lev ==
"logic")
173 else if ( pre_pipe && ( (lev ==
"all") || (lev ==
"*") ) )
175 level |= LOG_LEVEL_ALL;
177 else if ( (lev ==
"prefix_func") || (lev ==
"func") )
179 level |= LOG_PREFIX_FUNC;
181 else if ( (lev ==
"prefix_time") || (lev ==
"time") )
183 level |= LOG_PREFIX_TIME;
185 else if ( (lev ==
"prefix_node") || (lev ==
"node") )
187 level |= LOG_PREFIX_NODE;
189 else if ( (lev ==
"prefix_level") || (lev ==
"level") )
191 level |= LOG_PREFIX_LEVEL;
193 else if ( (lev ==
"prefix_all") ||
194 (!pre_pipe && ( (lev ==
"all") || (lev ==
"*") ) )
197 level |= LOG_PREFIX_ALL;
199 else if (lev ==
"level_error")
201 level |= LOG_LEVEL_ERROR;
203 else if (lev ==
"level_warn")
205 level |= LOG_LEVEL_WARN;
207 else if (lev ==
"level_debug")
209 level |= LOG_LEVEL_DEBUG;
211 else if (lev ==
"level_info")
213 level |= LOG_LEVEL_INFO;
215 else if (lev ==
"level_function")
217 level |= LOG_LEVEL_FUNCTION;
219 else if (lev ==
"level_logic")
221 level |= LOG_LEVEL_LOGIC;
223 else if (lev ==
"level_all")
225 level |= LOG_LEVEL_ALL;
227 else if (lev ==
"**")
229 level |= LOG_LEVEL_ALL | LOG_PREFIX_ALL;
233 }
while (next_lev != std::string::npos);
235 Enable ((
enum LogLevel)level);
245 LogComponent::IsEnabled (
enum LogLevel level)
const
248 return (level & m_levels) ? 1 : 0;
252 LogComponent::IsNoneEnabled (
void)
const
254 return m_levels == 0;
258 LogComponent::Enable (
enum LogLevel level)
264 LogComponent::Disable (
enum LogLevel level)
270 LogComponent::Name (
void)
const
276 LogComponent::GetLevelLabel(
const enum LogLevel level)
const
278 if (level == LOG_ERROR)
282 else if (level == LOG_WARN)
287 else if (level == LOG_DEBUG)
291 else if (level == LOG_INFO)
296 else if (level == LOG_FUNCTION)
300 else if (level == LOG_LOGIC)
313 ComponentList *components = GetComponentList ();
315 for (i = components->begin ();
316 i != components->end ();
319 if (i->first.compare (name) == 0)
321 i->second->Enable (level);
325 if (i == components->end())
330 "\" not found. See above for a list of available log components");
337 ComponentList *components = GetComponentList ();
338 for (ComponentListI i = components->begin ();
339 i != components->end ();
342 i->second->Enable (level);
349 ComponentList *components = GetComponentList ();
350 for (ComponentListI i = components->begin ();
351 i != components->end ();
354 if (i->first.compare (name) == 0)
356 i->second->Disable (level);
365 ComponentList *components = GetComponentList ();
366 for (ComponentListI i = components->begin ();
367 i != components->end ();
370 i->second->Disable (level);
377 ComponentList *components = GetComponentList ();
378 for (ComponentListI i = components->begin ();
379 i != components->end ();
382 std::cout << i->first <<
"=";
383 if (i->second->IsNoneEnabled ())
385 std::cout <<
"0" << std::endl;
388 if (i->second->IsEnabled (LOG_LEVEL_ALL))
394 if (i->second->IsEnabled (LOG_ERROR))
396 std::cout <<
"error";
398 if (i->second->IsEnabled (LOG_WARN))
400 std::cout <<
"|warn";
402 if (i->second->IsEnabled (LOG_DEBUG))
404 std::cout <<
"|debug";
406 if (i->second->IsEnabled (LOG_INFO))
408 std::cout <<
"|info";
410 if (i->second->IsEnabled (LOG_FUNCTION))
412 std::cout <<
"|function";
414 if (i->second->IsEnabled (LOG_LOGIC))
416 std::cout <<
"|logic";
419 if (i->second->IsEnabled (LOG_PREFIX_ALL))
421 std::cout <<
"|prefix_all";
425 if (i->second->IsEnabled (LOG_PREFIX_FUNC))
427 std::cout <<
"|func";
429 if (i->second->IsEnabled (LOG_PREFIX_TIME))
431 std::cout <<
"|time";
433 if (i->second->IsEnabled (LOG_PREFIX_NODE))
435 std::cout <<
"|node";
437 if (i->second->IsEnabled (LOG_PREFIX_LEVEL))
439 std::cout <<
"|level";
442 std::cout << std::endl;
446 static bool ComponentExists(std::string componentName)
448 char const*name=componentName.c_str();
449 ComponentList *components = GetComponentList ();
451 for (i = components->begin ();
452 i != components->end ();
455 if (i->first.compare (name) == 0)
465 static void CheckEnvironmentVariables (
void)
468 char *envVar = getenv (
"NS_LOG");
469 if (envVar == 0 || std::strlen(envVar) == 0)
473 std::string env = envVar;
475 std::string::size_type cur = 0;
476 std::string::size_type next = 0;
478 while (next != std::string::npos)
480 next = env.find_first_of (
":", cur);
481 std::string tmp = std::string (env, cur, next-cur);
482 std::string::size_type equal = tmp.find (
"=");
483 std::string component;
484 if (equal == std::string::npos)
488 if (ComponentExists(component) || component ==
"*")
495 NS_FATAL_ERROR(
"Invalid or unregistered component name \"" << component <<
496 "\" in env variable NS_LOG, see above for a list of valid components");
501 component = tmp.substr (0, equal);
502 if (ComponentExists(component) || component ==
"*")
504 std::string::size_type cur_lev;
505 std::string::size_type next_lev = equal;
508 cur_lev = next_lev + 1;
509 next_lev = tmp.find (
"|", cur_lev);
510 std::string lev = tmp.substr (cur_lev, next_lev - cur_lev);
518 || lev ==
"prefix_func"
520 || lev ==
"prefix_time"
522 || lev ==
"prefix_node"
524 || lev ==
"prefix_level"
526 || lev ==
"prefix_all"
527 || lev ==
"level_error"
528 || lev ==
"level_warn"
529 || lev ==
"level_debug"
530 || lev ==
"level_info"
531 || lev ==
"level_function"
532 || lev ==
"level_logic"
533 || lev ==
"level_all"
543 "\" in env variable NS_LOG for component name " << component);
545 }
while (next_lev != std::string::npos);
550 NS_FATAL_ERROR(
"Invalid or unregistered component name \"" << component <<
551 "\" in env variable NS_LOG, see above for a list of valid components");
558 void LogSetTimePrinter (LogTimePrinter printer)
560 g_logTimePrinter = printer;
563 CheckEnvironmentVariables();
565 LogTimePrinter LogGetTimePrinter (
void)
567 return g_logTimePrinter;
570 void LogSetNodePrinter (LogNodePrinter printer)
572 g_logNodePrinter = printer;
574 LogNodePrinter LogGetNodePrinter (
void)
576 return g_logNodePrinter;
580 ParameterLogger::ParameterLogger (std::ostream &os)
void LogComponentEnableAll(enum LogLevel level)
void LogComponentDisableAll(enum LogLevel level)
#define NS_ASSERT(condition)
#define NS_FATAL_ERROR(msg)
fatal error handling
void LogComponentDisable(char const *name, enum LogLevel level)
void LogComponentPrintList(void)
void LogComponentEnable(char const *name, enum LogLevel level)