14USERVER_NAMESPACE_BEGIN
22LoggerRef DefaultLoggerRef() noexcept;
24void SetDefaultLoggerRef(LoggerRef new_logger) noexcept;
46 LoggerRef logger_prev_;
47 const Level level_prev_;
48 LoggerPtr logger_new_;
54void SetLoggerLevel(LoggerRef,
Level);
59bool LoggerShouldLog(LoggerCRef logger,
Level level) noexcept;
61bool LoggerShouldLog(const LoggerPtr& logger,
Level level) noexcept;
63Level GetLoggerLevel(LoggerCRef logger) noexcept;
76 uint64_t count_since_reset = 0;
77 uint64_t dropped_count = 0;
78 std::chrono::steady_clock::time_point last_reset_time{};
84 RateLimiter(LoggerCRef logger, RateLimitData& data,
Level level)
noexcept;
85 bool ShouldLog()
const {
return should_log_; }
86 void SetShouldNotLog() { should_log_ =
false; }
87 Level GetLevel()
const {
return level_; }
92 bool should_log_{
false};
93 uint64_t dropped_count_{0};
97class StaticLogEntry final {
99 StaticLogEntry(
const char* path,
int line)
noexcept;
101 StaticLogEntry(StaticLogEntry&&) =
delete;
102 StaticLogEntry& operator=(StaticLogEntry&&) =
delete;
105 bool ShouldNotLog(
Level level)
const noexcept;
108 static constexpr std::size_t kContentSize =
110 alignas(
void*) std::byte content[kContentSize];
113template <
class NameHolder,
int Line>
114struct EntryStorage final {
115 static inline StaticLogEntry entry{NameHolder::Get(), Line};
125#define DO_LOG_TO(logger, lvl) \
126 USERVER_NAMESPACE::logging::LogHelper(logger, lvl, USERVER_FILEPATH, \
127 __LINE__, __func__) \
138 [](USERVER_NAMESPACE::logging::Level level) -> bool { \
139 struct NameHolder { \
140 static constexpr const char* Get() noexcept { \
141 return USERVER_FILEPATH; \
144 const auto& entry = \
145 USERVER_NAMESPACE::logging::impl::EntryStorage<NameHolder, \
147 return (!USERVER_NAMESPACE::logging::ShouldLog(level) || \
148 entry.ShouldNotLog(level)) && \
149 !entry.ShouldLog(); \
151 static_cast<int>(lvl) < \
152 static_cast<int>(USERVER_NAMESPACE::logging::Level::kInfo)) \
153 ? USERVER_NAMESPACE::logging::impl::Noop{} \
154 : DO_LOG_TO(USERVER_NAMESPACE::logging::impl::DefaultLoggerRef(), (lvl))
160#define LOG_TO(logger, lvl) \
161 !USERVER_NAMESPACE::logging::LoggerShouldLog((logger), (lvl)) \
162 ? USERVER_NAMESPACE::logging::impl::Noop{} \
163 : DO_LOG_TO((logger), (lvl))
168#define LOG_TRACE() LOG(USERVER_NAMESPACE::logging::Level::kTrace)
173#define LOG_DEBUG() LOG(USERVER_NAMESPACE::logging::Level::kDebug)
178#define LOG_INFO() LOG(USERVER_NAMESPACE::logging::Level::kInfo)
183#define LOG_WARNING() LOG(USERVER_NAMESPACE::logging::Level::kWarning)
188#define LOG_ERROR() LOG(USERVER_NAMESPACE::logging::Level::kError)
193#define LOG_CRITICAL() LOG(USERVER_NAMESPACE::logging::Level::kCritical)
200#define LOG_TRACE_TO(logger) \
201 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kTrace)
206#define LOG_DEBUG_TO(logger) \
207 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kDebug)
212#define LOG_INFO_TO(logger) \
213 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kInfo)
218#define LOG_WARNING_TO(logger) \
219 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kWarning)
224#define LOG_ERROR_TO(logger) \
225 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kError)
230#define LOG_CRITICAL_TO(logger) \
231 LOG_TO(logger, USERVER_NAMESPACE::logging::Level::kCritical)
242#define LOG_LIMITED_TO(logger, lvl) \
243 for (USERVER_NAMESPACE::logging::impl::RateLimiter log_limited_to_rl{ \
245 []() -> USERVER_NAMESPACE::logging::impl::RateLimitData& { \
246 thread_local USERVER_NAMESPACE::logging::impl::RateLimitData \
251 log_limited_to_rl.ShouldLog(); log_limited_to_rl.SetShouldNotLog()) \
252 LOG_TO((logger), log_limited_to_rl.GetLevel()) << log_limited_to_rl
257#define LOG_LIMITED(lvl) \
258 LOG_LIMITED_TO(USERVER_NAMESPACE::logging::impl::DefaultLoggerRef(), lvl)
264#define LOG_LIMITED_TRACE() \
265 LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kTrace)
271#define LOG_LIMITED_DEBUG() \
272 LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kDebug)
278#define LOG_LIMITED_INFO() LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kInfo)
284#define LOG_LIMITED_WARNING() \
285 LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kWarning)
291#define LOG_LIMITED_ERROR() \
292 LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kError)
298#define LOG_LIMITED_CRITICAL() \
299 LOG_LIMITED(USERVER_NAMESPACE::logging::Level::kCritical)
307#define LOG_LIMITED_TRACE_TO(logger) \
308 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kTrace)
314#define LOG_LIMITED_DEBUG_TO(logger) \
315 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kDebug)
321#define LOG_LIMITED_INFO_TO(logger) \
322 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kInfo)
328#define LOG_LIMITED_WARNING_TO(logger) \
329 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kWarning)
335#define LOG_LIMITED_ERROR_TO(logger) \
336 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kError)
342#define LOG_LIMITED_CRITICAL_TO(logger) \
343 LOG_LIMITED_TO(logger, USERVER_NAMESPACE::logging::Level::kCritical)