CLogger.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "StdInc.h"
  2. #include "CLogger.h"
  3. #include "LogRecord.h"
  4. #include "ILogTarget.h"
  5. #include "CLogManager.h"
  6. boost::mutex CGLogger::smx;
  7. const std::string CLoggerDomain::DOMAIN_GLOBAL = "global";
  8. CLoggerDomain::CLoggerDomain(const std::string & name) : name(name)
  9. {
  10. if(name.empty()) throw std::runtime_error("Logger domain cannot be empty.");
  11. }
  12. CLoggerDomain CLoggerDomain::getParent() const
  13. {
  14. if(isGlobalDomain()) return *this;
  15. size_t pos = name.find_last_of(".");
  16. if(pos != std::string::npos)
  17. {
  18. return CLoggerDomain(name.substr(0, pos));
  19. }
  20. else
  21. {
  22. return CLoggerDomain(DOMAIN_GLOBAL);
  23. }
  24. }
  25. bool CLoggerDomain::isGlobalDomain() const
  26. {
  27. return name == DOMAIN_GLOBAL;
  28. }
  29. std::string CLoggerDomain::getName() const
  30. {
  31. return name;
  32. }
  33. CGLogger * CGLogger::getLogger(const CLoggerDomain & domain)
  34. {
  35. TLockGuard _(smx);
  36. CGLogger * logger = CLogManager::get()->getLogger(domain);
  37. if(logger)
  38. {
  39. return logger;
  40. }
  41. else
  42. {
  43. logger = new CGLogger(domain);
  44. if(domain.isGlobalDomain())
  45. {
  46. logger->setLevel(ELogLevel::INFO);
  47. }
  48. CLogManager::get()->addLogger(logger);
  49. return logger;
  50. }
  51. }
  52. CGLogger * CGLogger::getGlobalLogger()
  53. {
  54. return getLogger(CLoggerDomain::DOMAIN_GLOBAL);
  55. }
  56. CGLogger::CGLogger(const CLoggerDomain & domain) : domain(domain), level(ELogLevel::INFO)
  57. {
  58. if(!domain.isGlobalDomain())
  59. {
  60. parent = getLogger(domain.getParent());
  61. }
  62. }
  63. CGLogger::~CGLogger()
  64. {
  65. BOOST_FOREACH(ILogTarget * target, targets)
  66. {
  67. delete target;
  68. }
  69. }
  70. void CGLogger::trace(const std::string & message) const
  71. {
  72. log(ELogLevel::TRACE, message);
  73. }
  74. void CGLogger::debug(const std::string & message) const
  75. {
  76. log(ELogLevel::DEBUG, message);
  77. }
  78. void CGLogger::info(const std::string & message) const
  79. {
  80. log(ELogLevel::INFO, message);
  81. }
  82. void CGLogger::warn(const std::string & message) const
  83. {
  84. log(ELogLevel::WARN, message);
  85. }
  86. void CGLogger::error(const std::string & message) const
  87. {
  88. log(ELogLevel::ERROR, message);
  89. }
  90. void CGLogger::log(ELogLevel::ELogLevel level, const std::string & message) const
  91. {
  92. if(getEffectiveLevel() <= level)
  93. {
  94. callTargets(LogRecord(domain, level, message));
  95. }
  96. }
  97. ELogLevel::ELogLevel CGLogger::getLevel() const
  98. {
  99. TReadLock _(mx);
  100. return level;
  101. }
  102. void CGLogger::setLevel(ELogLevel::ELogLevel level)
  103. {
  104. TWriteLock _(mx);
  105. if(domain.isGlobalDomain() && level == ELogLevel::NOT_SET) return;
  106. this->level = level;
  107. }
  108. const CLoggerDomain & CGLogger::getDomain() const
  109. {
  110. return domain;
  111. }
  112. void CGLogger::addTarget(ILogTarget * target)
  113. {
  114. TWriteLock _(mx);
  115. targets.push_back(target);
  116. }
  117. std::list<ILogTarget *> CGLogger::getTargets() const
  118. {
  119. TReadLock _(mx);
  120. return targets;
  121. }
  122. ELogLevel::ELogLevel CGLogger::getEffectiveLevel() const
  123. {
  124. for(const CGLogger * logger = this; logger != nullptr; logger = logger->parent)
  125. {
  126. if(logger->getLevel() != ELogLevel::NOT_SET) return logger->getLevel();
  127. }
  128. // This shouldn't be reached, as the root logger must have set a log level
  129. return ELogLevel::INFO;
  130. }
  131. void CGLogger::callTargets(const LogRecord & record) const
  132. {
  133. for(const CGLogger * logger = this; logger != nullptr; logger = logger->parent)
  134. {
  135. BOOST_FOREACH(ILogTarget * target, logger->getTargets())
  136. {
  137. target->write(record);
  138. }
  139. }
  140. }