25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
4.5 KiB

  1. #pragma once
  2. #include <set>
  3. #include <map>
  4. #include <regex>
  5. #include <mutex>
  6. #include <iostream>
  7. #include "Logger.h"
  8. namespace logging
  9. {
  10. struct Consumer
  11. {
  12. private:
  13. std::string _name;
  14. public:
  15. virtual void log(DataPtrS data) = 0;
  16. inline const std::string& name() const
  17. { return _name; }
  18. Consumer(const std::string& n, bool autoRegister);
  19. ~Consumer();
  20. };
  21. struct StreamConsumer : public Consumer
  22. {
  23. private:
  24. mutable std::mutex _mutex;
  25. std::ostream* _stream;
  26. bool _ownsStream;
  27. public:
  28. void log(DataPtrS data) override;
  29. StreamConsumer(const std::string& name, std::ostream& stream, bool ownsStream, bool autoRegister) :
  30. Consumer (name, autoRegister),
  31. _stream (&stream),
  32. _ownsStream (ownsStream)
  33. { }
  34. virtual ~StreamConsumer()
  35. {
  36. if (_ownsStream && _stream)
  37. {
  38. delete _stream;
  39. _stream = nullptr;
  40. }
  41. }
  42. };
  43. struct Matcher
  44. {
  45. virtual bool match(const Logger& logger) const
  46. { return false; }
  47. virtual bool match(const Consumer& consumer) const
  48. { return false; }
  49. };
  50. struct AllMatcher : public Matcher
  51. {
  52. bool match(const Logger& logger) const override;
  53. bool match(const Consumer& consumer) const override;
  54. };
  55. struct RegexMatcher : public Matcher
  56. {
  57. private:
  58. std::regex _regex;
  59. bool _invert;
  60. public:
  61. bool match(const Logger& logger) const override;
  62. bool match(const Consumer& consumer) const override;
  63. RegexMatcher(const std::string expression, bool invert = false) :
  64. _regex (expression),
  65. _invert (invert)
  66. { }
  67. };
  68. struct DefaultLoggerMatcher : public Matcher
  69. {
  70. private:
  71. Logger& _defaultLogger;
  72. public:
  73. using Matcher::match;
  74. bool match(const Logger& logger) const override;
  75. DefaultLoggerMatcher() :
  76. _defaultLogger(getLogger(std::string()))
  77. { }
  78. };
  79. using RuleHandle = void*;
  80. using MatcherPtrU = std::unique_ptr<Matcher>;
  81. struct Rule
  82. {
  83. private:
  84. mutable std::mutex _mutex;
  85. std::set<Consumer*> _consumer;
  86. public:
  87. MatcherPtrU loggerMatcher;
  88. MatcherPtrU consumerMatcher;
  89. Level minLevel;
  90. Level maxLevel;
  91. inline bool isEnabled(Level level) const
  92. {
  93. return minLevel <= level
  94. && maxLevel >= level;
  95. }
  96. inline void registerConsumer(Consumer& consumer)
  97. {
  98. std::lock_guard<std::mutex> lk(_mutex);
  99. _consumer.insert(&consumer);
  100. }
  101. inline void unregisterConsumer(Consumer& consumer)
  102. {
  103. std::lock_guard<std::mutex> lk(_mutex);
  104. _consumer.erase(&consumer);
  105. }
  106. inline void log(DataPtrS data)
  107. {
  108. std::lock_guard<std::mutex> lk(_mutex);
  109. if (isEnabled(data->level))
  110. {
  111. for (auto& c : _consumer)
  112. c->log(data);
  113. }
  114. }
  115. Rule(MatcherPtrU lm, MatcherPtrU cm, Level min, Level max) :
  116. loggerMatcher (std::move(lm)),
  117. consumerMatcher(std::move(cm)),
  118. minLevel (min),
  119. maxLevel (max)
  120. { }
  121. };
  122. struct LoggerImpl : public Logger
  123. {
  124. private:
  125. mutable std::mutex _mutex;
  126. std::string _name;
  127. std::set<Rule*> _rules;
  128. public:
  129. const std::string& name() const override;
  130. bool isEnabled(Level level) const override;
  131. void log(DataPtrS data) const override;
  132. inline void registerRule(Rule& rule)
  133. {
  134. std::lock_guard<std::mutex> lk(_mutex);
  135. _rules.insert(&rule);
  136. }
  137. inline void unregisterRule(Rule& rule)
  138. {
  139. std::lock_guard<std::mutex> lk(_mutex);
  140. _rules.erase(&rule);
  141. }
  142. LoggerImpl(const std::string& n) :
  143. _name(n)
  144. { }
  145. };
  146. void registerConsumer (Consumer& consumer);
  147. void unregisterConsumer(Consumer& consumer);
  148. RuleHandle defineRule(MatcherPtrU loggerMatcher, MatcherPtrU consumerMatcher, Level minLevel = Level::Debug, Level maxLevel = Level::Error);
  149. void undefineRule(RuleHandle handle);
  150. }