You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.1 KiB

  1. #include <list>
  2. #include <iomanip>
  3. #include "cpputils/logger_impl.h"
  4. using namespace logging;
  5. std::string EmptyString;
  6. consumer::consumer(const std::string& n, bool autoRegister) :
  7. _name(n)
  8. {
  9. if (autoRegister)
  10. register_consumer(*this);
  11. }
  12. consumer::~consumer()
  13. { unregister_consumer(*this); }
  14. void consumer_stream::log(data_ptr_s data)
  15. {
  16. std::lock_guard<std::mutex> lk(_mutex);
  17. using namespace std;
  18. if (!data)
  19. return;
  20. auto& d = *data;
  21. auto t = std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1>>>(d.time.time_since_epoch()).count();
  22. auto f = d.file;
  23. if (f)
  24. {
  25. auto tmp = strrchr(f, '/');
  26. if (tmp)
  27. f = tmp + 1;
  28. }
  29. else
  30. f = "unknown";
  31. StreamFormatSaver formatSaver(*_stream);
  32. if (t >= 0) *_stream << "[" << fixed << setfill(' ') << setw(17) << setprecision(6) << t << "] ";
  33. switch(d.level)
  34. {
  35. case level::Debug: *_stream << "DEBUG "; break;
  36. case level::Info: *_stream << "INFO "; break;
  37. case level::Warn: *_stream << "WARN "; break;
  38. case level::Error: *_stream << "ERROR "; break;
  39. }
  40. if (d.sender) *_stream << "0x" << hex << setw(2 * sizeof(void*)) << setfill('0') << d.sender;
  41. else *_stream << " ";
  42. if (d.thread != std::thread::id()) *_stream << "@" << hex << setw(2 * sizeof(void*)) << setfill('0') << d.thread;
  43. else *_stream << " ";
  44. if (!d.name.empty()) *_stream << " '" << d.name << "'";
  45. if (d.line) *_stream << " - " << setw(25) << setfill(' ') << f << ":" << setw(5) << setfill(' ') << dec << d.line;
  46. if (!d.message.empty())
  47. {
  48. *_stream << ": " << d.message;
  49. if (d.message.back() != '\n')
  50. *_stream << std::endl;
  51. }
  52. else
  53. *_stream << std::endl;
  54. }
  55. bool matcher_all::match(const logger& logger) const
  56. { return true; }
  57. bool matcher_all::match(const consumer& consumer) const
  58. { return true; }
  59. bool matcher_regex::match(const logger& logger) const
  60. { return !logger.name().empty() && std::regex_match(logger.name(), _regex) != _invert; }
  61. bool matcher_regex::match(const consumer& consumer) const
  62. { return !consumer.name().empty() && std::regex_match(consumer.name(), _regex) != _invert; }
  63. bool matcher_default::match(const logger& logger) const
  64. { return &_defaultLogger == &logger; }
  65. const std::string& logger::name() const
  66. { return EmptyString; }
  67. bool logger::is_enabled(level level) const
  68. { return false; }
  69. void logger::log(data_ptr_s data) const
  70. { /* no op */ }
  71. const std::string& logger_impl::name() const
  72. { return _name; }
  73. bool logger_impl::is_enabled(level level) const
  74. {
  75. for (auto& rule : _rules)
  76. {
  77. if (rule->is_enabled(level))
  78. return true;
  79. }
  80. return false;
  81. }
  82. void logger_impl::log(data_ptr_s data) const
  83. {
  84. std::lock_guard<std::mutex> lk(_mutex);
  85. for (auto& r : _rules)
  86. r->log(data);
  87. }
  88. namespace logging
  89. {
  90. }