craigdo@1498: /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ craigdo@1498: /* craigdo@1498: * Copyright (c) 2006,2007 INRIA craigdo@1498: * craigdo@1498: * This program is free software; you can redistribute it and/or modify craigdo@1498: * it under the terms of the GNU General Public License version 2 as craigdo@1498: * published by the Free Software Foundation; craigdo@1498: * craigdo@1498: * This program is distributed in the hope that it will be useful, craigdo@1498: * but WITHOUT ANY WARRANTY; without even the implied warranty of craigdo@1498: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the craigdo@1498: * GNU General Public License for more details. craigdo@1498: * craigdo@1498: * You should have received a copy of the GNU General Public License craigdo@1498: * along with this program; if not, write to the Free Software craigdo@1498: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA craigdo@1498: * craigdo@1498: * Author: Mathieu Lacage craigdo@1498: */ gjc@3483: #include "log.h" craigdo@1506: craigdo@1506: #ifdef NS3_LOG_ENABLE craigdo@1506: craigdo@1498: #include craigdo@1498: #include craigdo@1498: #include craigdo@1498: #include "assert.h" craigdo@1498: #include "ns3/core-config.h" craigdo@1498: #include "fatal-error.h" craigdo@1498: craigdo@1498: #ifdef HAVE_STDLIB_H craigdo@1498: #include craigdo@1498: #endif craigdo@1498: craigdo@1498: namespace ns3 { craigdo@1498: mathieu@2979: LogTimePrinter g_logTimePrinter = 0; mathieu@2979: craigdo@1498: typedef std::list > ComponentList; craigdo@1498: typedef std::list >::iterator ComponentListI; craigdo@1498: mathieu@1861: static class PrintList mathieu@1861: { mathieu@1861: public: mathieu@1861: PrintList (); mathieu@1861: } g_printList; mathieu@1861: craigdo@1498: static craigdo@1498: ComponentList *GetComponentList (void) craigdo@1498: { craigdo@1498: static ComponentList components; craigdo@1498: return &components; craigdo@1498: } craigdo@1498: mathieu@1861: mathieu@1861: mathieu@1861: PrintList::PrintList () mathieu@1861: { mathieu@1861: #ifdef HAVE_GETENV mathieu@1861: char *envVar = getenv("NS_LOG"); mathieu@1861: if (envVar == 0) mathieu@1861: { mathieu@1861: return; mathieu@1861: } mathieu@1861: std::string env = envVar; mathieu@1861: std::string::size_type cur = 0; mathieu@1861: std::string::size_type next = 0; mathieu@1861: while (next != std::string::npos) mathieu@1861: { mathieu@2982: next = env.find_first_of (":", cur); mathieu@1861: std::string tmp = std::string (env, cur, next-cur); mathieu@1861: if (tmp == "print-list") mathieu@1861: { mathieu@1861: LogComponentPrintList (); mathieu@1861: exit (0); mathieu@1861: break; mathieu@1861: } mathieu@1861: cur = next + 1; mathieu@1861: } mathieu@1861: #endif mathieu@1861: } mathieu@1861: mathieu@1861: craigdo@1783: LogComponent::LogComponent (char const * name) craigdo@1783: : m_levels (0), m_name (name) craigdo@1498: { craigdo@1783: EnvVarCheck (name); craigdo@1783: craigdo@1783: ComponentList *components = GetComponentList (); craigdo@1783: for (ComponentListI i = components->begin (); craigdo@1783: i != components->end (); craigdo@1783: i++) craigdo@1498: { mathieu@2809: if (i->first == name) mathieu@2809: { mathieu@2809: NS_FATAL_ERROR ("Log component \""<push_back (std::make_pair (name, this)); craigdo@1783: } craigdo@1775: craigdo@1783: void craigdo@1783: LogComponent::EnvVarCheck (char const * name) craigdo@1783: { craigdo@1498: #ifdef HAVE_GETENV craigdo@1498: char *envVar = getenv("NS_LOG"); craigdo@1498: if (envVar == 0) craigdo@1498: { craigdo@1498: return; craigdo@1498: } craigdo@1498: std::string env = envVar; craigdo@1783: std::string myName = name; craigdo@1783: craigdo@1498: std::string::size_type cur = 0; craigdo@1498: std::string::size_type next = 0; mathieu@1862: while (next != std::string::npos) craigdo@1498: { mathieu@2982: next = env.find_first_of (":", cur); mathieu@1862: std::string tmp = std::string (env, cur, next-cur); craigdo@1498: std::string::size_type equal = tmp.find ("="); craigdo@1498: std::string component; craigdo@1498: if (equal == std::string::npos) craigdo@1498: { craigdo@1498: component = tmp; craigdo@1783: if (component == myName || component == "*") craigdo@1783: { mathieu@2982: int level = LOG_ALL | LOG_PREFIX_TIME | LOG_PREFIX_FUNC; mathieu@2982: Enable ((enum LogLevel)level); craigdo@1783: return; craigdo@1783: } craigdo@1498: } craigdo@1498: else craigdo@1498: { craigdo@1498: component = tmp.substr (0, equal); craigdo@1783: if (component == myName || component == "*") craigdo@1498: { craigdo@1783: int level = 0; craigdo@1783: std::string::size_type cur_lev; craigdo@1783: std::string::size_type next_lev = equal; craigdo@1783: do craigdo@1503: { craigdo@1783: cur_lev = next_lev + 1; craigdo@1783: next_lev = tmp.find ("|", cur_lev); craigdo@1783: std::string lev = tmp.substr (cur_lev, next_lev - cur_lev); craigdo@1783: if (lev == "error") craigdo@1783: { craigdo@1783: level |= LOG_ERROR; craigdo@1783: } craigdo@1783: else if (lev == "warn") craigdo@1783: { craigdo@1783: level |= LOG_WARN; craigdo@1783: } craigdo@1783: else if (lev == "debug") craigdo@1783: { craigdo@1783: level |= LOG_DEBUG; craigdo@1783: } craigdo@1783: else if (lev == "info") craigdo@1783: { craigdo@1783: level |= LOG_INFO; craigdo@1783: } craigdo@1783: else if (lev == "function") craigdo@1783: { craigdo@1783: level |= LOG_FUNCTION; craigdo@1783: } craigdo@1783: else if (lev == "logic") craigdo@1783: { craigdo@1783: level |= LOG_LOGIC; craigdo@1783: } craigdo@1783: else if (lev == "all") craigdo@1783: { craigdo@1783: level |= LOG_ALL; craigdo@1783: } mathieu@2979: else if (lev == "prefix_func") craigdo@1783: { mathieu@2979: level |= LOG_PREFIX_FUNC; mathieu@2979: } mathieu@2979: else if (lev == "prefix_time") mathieu@2979: { mathieu@2979: level |= LOG_PREFIX_TIME; craigdo@1783: } craigdo@1783: else if (lev == "level_error") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_ERROR; craigdo@1783: } craigdo@1783: else if (lev == "level_warn") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_WARN; craigdo@1783: } craigdo@1783: else if (lev == "level_debug") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_DEBUG; craigdo@1783: } craigdo@1783: else if (lev == "level_info") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_INFO; craigdo@1783: } craigdo@1783: else if (lev == "level_function") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_FUNCTION; craigdo@1783: } craigdo@1783: else if (lev == "level_logic") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_LOGIC; craigdo@1783: } craigdo@1783: else if (lev == "level_all") craigdo@1783: { craigdo@1783: level |= LOG_LEVEL_ALL; craigdo@1783: } craigdo@1783: } while (next_lev != std::string::npos); craigdo@1783: craigdo@1783: Enable ((enum LogLevel)level); craigdo@1498: } craigdo@1498: } craigdo@1498: cur = next + 1; craigdo@1498: } craigdo@1498: #endif craigdo@1498: } craigdo@1498: craigdo@1503: craigdo@1498: bool craigdo@1498: LogComponent::IsEnabled (enum LogLevel level) const craigdo@1498: { craigdo@1775: // LogComponentEnableEnvVar (); craigdo@1507: return (level & m_levels) ? 1 : 0; craigdo@1498: } craigdo@1503: craigdo@1498: bool craigdo@1498: LogComponent::IsNoneEnabled (void) const craigdo@1498: { craigdo@1498: return m_levels == 0; craigdo@1498: } craigdo@1503: craigdo@1498: void craigdo@1498: LogComponent::Enable (enum LogLevel level) craigdo@1498: { craigdo@1498: m_levels |= level; craigdo@1498: } craigdo@1503: craigdo@1498: void craigdo@1498: LogComponent::Disable (enum LogLevel level) craigdo@1498: { craigdo@1498: m_levels &= ~level; craigdo@1498: } craigdo@1498: craigdo@1772: char const * craigdo@1772: LogComponent::Name (void) const craigdo@1772: { craigdo@1772: return m_name; craigdo@1772: } craigdo@1772: craigdo@1772: craigdo@1498: void craigdo@1498: LogComponentEnable (char const *name, enum LogLevel level) craigdo@1498: { craigdo@1498: ComponentList *components = GetComponentList (); craigdo@1498: for (ComponentListI i = components->begin (); craigdo@1498: i != components->end (); craigdo@1498: i++) craigdo@1498: { craigdo@1498: if (i->first.compare (name) == 0) craigdo@1498: { craigdo@1498: i->second->Enable (level); craigdo@1498: break; craigdo@1498: } craigdo@1498: } craigdo@1498: } craigdo@1503: craigdo@1498: void craigdo@1772: LogComponentEnableAll (enum LogLevel level) craigdo@1772: { craigdo@1772: ComponentList *components = GetComponentList (); craigdo@1772: for (ComponentListI i = components->begin (); craigdo@1772: i != components->end (); craigdo@1772: i++) craigdo@1772: { craigdo@1772: i->second->Enable (level); craigdo@1772: } craigdo@1772: } craigdo@1772: craigdo@1772: void craigdo@1498: LogComponentDisable (char const *name, enum LogLevel level) craigdo@1498: { craigdo@1498: ComponentList *components = GetComponentList (); craigdo@1498: for (ComponentListI i = components->begin (); craigdo@1498: i != components->end (); craigdo@1498: i++) craigdo@1498: { craigdo@1498: if (i->first.compare (name) == 0) craigdo@1498: { craigdo@1498: i->second->Disable (level); craigdo@1498: break; craigdo@1498: } craigdo@1498: } craigdo@1498: } craigdo@1498: craigdo@1498: void craigdo@1772: LogComponentDisableAll (enum LogLevel level) craigdo@1772: { craigdo@1772: ComponentList *components = GetComponentList (); craigdo@1772: for (ComponentListI i = components->begin (); craigdo@1772: i != components->end (); craigdo@1772: i++) craigdo@1772: { craigdo@1772: i->second->Disable (level); craigdo@1772: } craigdo@1772: } craigdo@1772: craigdo@1772: void craigdo@1498: LogComponentPrintList (void) craigdo@1498: { craigdo@1498: ComponentList *components = GetComponentList (); craigdo@1498: for (ComponentListI i = components->begin (); craigdo@1498: i != components->end (); craigdo@1498: i++) craigdo@1498: { craigdo@1498: std::cout << i->first << "="; craigdo@1498: if (i->second->IsNoneEnabled ()) craigdo@1498: { craigdo@1498: std::cout << "0" << std::endl; craigdo@1498: continue; craigdo@1498: } craigdo@1507: if (i->second->IsEnabled (LOG_ERROR)) craigdo@1503: { craigdo@1503: std::cout << "error"; craigdo@1503: } craigdo@1507: if (i->second->IsEnabled (LOG_WARN)) craigdo@1503: { craigdo@1503: std::cout << "|warn"; craigdo@1503: } craigdo@1507: if (i->second->IsEnabled (LOG_DEBUG)) craigdo@1498: { craigdo@1503: std::cout << "|debug"; craigdo@1503: } craigdo@1507: if (i->second->IsEnabled (LOG_INFO)) craigdo@1503: { craigdo@1503: std::cout << "|info"; craigdo@1498: } craigdo@1507: if (i->second->IsEnabled (LOG_FUNCTION)) craigdo@1498: { craigdo@1503: std::cout << "|function"; craigdo@1498: } craigdo@1507: if (i->second->IsEnabled (LOG_LOGIC)) craigdo@1498: { craigdo@1503: std::cout << "|logic"; craigdo@1498: } craigdo@1507: if (i->second->IsEnabled (LOG_ALL)) craigdo@1498: { craigdo@1503: std::cout << "|all"; craigdo@1498: } craigdo@1498: std::cout << std::endl; craigdo@1498: } craigdo@1498: } craigdo@1498: mathieu@3005: void LogSetTimePrinter (LogTimePrinter printer) mathieu@2979: { mathieu@2979: g_logTimePrinter = printer; mathieu@2979: } mathieu@2979: LogTimePrinter LogGetTimePrinter(void) mathieu@2979: { mathieu@2979: return g_logTimePrinter; mathieu@2979: } mathieu@2979: mathieu@2979: mathieu@2979: ParameterLogger::ParameterLogger (std::ostream &os) mathieu@2979: : m_itemNumber (0), mathieu@2979: m_os (os) mathieu@2976: {} tomh@1828: craigdo@1498: } // namespace ns3 craigdo@1498: gjc@3483: #else // NS3_LOG_ENABLE gjc@3483: gjc@3483: namespace ns3 { gjc@3483: gjc@3483: void gjc@3483: LogComponentEnable (char const *name, enum LogLevel level) gjc@3483: { gjc@3483: gjc@3483: } gjc@3483: gjc@3483: void gjc@3483: LogComponentEnableAll (enum LogLevel level) gjc@3483: { gjc@3483: gjc@3483: } gjc@3483: gjc@3483: void gjc@3483: LogComponentDisable (char const *name, enum LogLevel level) gjc@3483: { gjc@3483: gjc@3483: } gjc@3483: gjc@3483: void gjc@3483: LogComponentDisableAll (enum LogLevel level) gjc@3483: { gjc@3483: gjc@3483: } gjc@3483: gjc@3483: } // namespace ns3 gjc@3483: gjc@3483: #endif