115struct OPENDHT_PUBLIC Logger
118 Logger(LogMethod&& l, std::string tag =
"")
119 : logger_(std::move(l))
120 , tag_(std::move(tag))
121 , prefix_(tag_.empty() ?
"" : fmt::format(
"[{}] ", tag_))
124 throw std::invalid_argument {
"logger must be set"};
126 Logger(
const Logger& parent, std::string tag)
127 : logger_(parent.logger_)
128 , tag_(std::move(tag))
129 , prefix_(fmt::format(
"{}[{}] ", parent.prefix_, tag_))
132 std::shared_ptr<Logger> createChild(std::string tag)
134 std::lock_guard<std::mutex> lock {children_mutex_};
135 auto child = std::make_shared<Logger>(*
this, std::move(tag));
136 children_.push_back(child);
140 void setFilter(std::string_view filter)
142 std::lock_guard<std::mutex> lock {children_mutex_};
143 enable_ = filter.empty() or tag_.find(filter) != std::string_view::npos;
144 for (
auto it = children_.begin(); it != children_.end();) {
145 if (
auto c = it->lock()) {
146 c->setFilter(enable_ ? std::string_view {} : filter);
149 it = children_.erase(it);
154 void setFilter(
const InfoHash& f) { setFilter(f.
to_view()); }
156 inline void log0(
source_loc loc, LogLevel level, fmt::string_view format, fmt::printf_args args)
const
159 logger_(loc, level, prefix_, fmt::vsprintf(format, args));
161 template<
typename... Args>
162 inline void debug(
LogFormat<type_identity_t<Args>...> format, Args&&... args)
const
165 logger_(format.loc, LogLevel::debug, prefix_, fmt::format(format.fmt, std::forward<Args>(args)...));
167 template<
typename... Args>
168 inline void warn(
LogFormat<type_identity_t<Args>...> format, Args&&... args)
const
171 logger_(format.loc, LogLevel::warning, prefix_, fmt::format(format.fmt, std::forward<Args>(args)...));
173 template<
typename... Args>
174 inline void error(
LogFormat<type_identity_t<Args>...> format, Args&&... args)
const
177 logger_(format.loc, LogLevel::error, prefix_, fmt::format(format.fmt, std::forward<Args>(args)...));
179 template<
typename... T>
180 inline void d(
LogFormat<type_identity_t<T>...> format, T&&... args)
const
182 log0(format.loc, LogLevel::debug, format.fmt, fmt::make_printf_args(args...));
184 template<
typename... T>
185 inline void w(
LogFormat<type_identity_t<T>...> format, T&&... args)
const
187 log0(format.loc, LogLevel::warning, format.fmt, fmt::make_printf_args(args...));
189 template<
typename... T>
190 inline void e(
LogFormat<type_identity_t<T>...> format, T&&... args)
const
192 log0(format.loc, LogLevel::error, format.fmt, fmt::make_printf_args(args...));
196 const LogMethod logger_ = {};
197 const std::string tag_ {};
198 const std::string prefix_ {};
199 std::mutex children_mutex_ {};
200 std::vector<std::weak_ptr<Logger>> children_ {};