8#include <userver/compiler/select.hpp>
9#include <userver/logging/fwd.hpp>
10#include <userver/logging/level.hpp>
11#include <userver/logging/log_filepath.hpp>
12#include <userver/logging/log_helper.hpp>
14USERVER_NAMESPACE_BEGIN
20void SetDefaultLoggerRef(LoggerRef new_logger)
noexcept;
22extern bool has_background_threads_which_can_log;
38class DefaultLoggerGuard
final {
47 DefaultLoggerGuard(DefaultLoggerGuard&&) =
delete;
48 DefaultLoggerGuard& operator=(DefaultLoggerGuard&&) =
delete;
50 ~DefaultLoggerGuard();
53 LoggerRef logger_prev_;
54 const Level level_prev_;
55 LoggerPtr logger_new_;
65class DefaultLoggerLevelScope
final {
69 DefaultLoggerLevelScope(DefaultLoggerLevelScope&&) =
delete;
70 DefaultLoggerLevelScope& operator=(DefaultLoggerLevelScope&&) =
delete;
72 ~DefaultLoggerLevelScope();
75 impl::LoggerBase& logger_;
76 const Level level_initial_;
93bool LoggerShouldLog(LoggerRef logger,
Level level)
noexcept;
95bool LoggerShouldLog(
const LoggerPtr& logger,
Level level)
noexcept;
97Level GetLoggerLevel(LoggerRef logger)
noexcept;
110 uint64_t count_since_reset = 0;
111 uint64_t dropped_count = 0;
112 std::chrono::steady_clock::time_point last_reset_time{};
118 RateLimiter(RateLimitData& data,
Level level)
noexcept;
119 bool ShouldLog()
const {
return should_log_; }
120 void SetShouldNotLog() { should_log_ =
false; }
121 Level GetLevel()
const {
return level_; }
122 friend LogHelper& operator<<(LogHelper& lh,
const RateLimiter& rl)
noexcept;
126 bool should_log_{
true};
127 uint64_t dropped_count_{0};
131class StaticLogEntry
final {
133 StaticLogEntry(
const char* path,
int line)
noexcept;
135 StaticLogEntry(StaticLogEntry&&) =
delete;
136 StaticLogEntry& operator=(StaticLogEntry&&) =
delete;
138 bool ShouldNotLog(LoggerRef logger,
Level level)
const noexcept;
139 bool ShouldNotLog(
const LoggerPtr& logger,
Level level)
const noexcept;
142 static constexpr std::size_t kContentSize =
compiler::SelectSize().For64Bit(40).For32Bit(24);
144 alignas(
void*) std::byte content_[kContentSize];
147template <
class NameHolder,
int Line>
148struct EntryStorage
final {
149 static inline StaticLogEntry entry{NameHolder::Get(), Line};
158#ifdef USERVER_FEATURE_ERASE_LOG_WITH_LEVEL
165#define USERVER_IMPL_ERASE_LOG
167 ? logging::impl::Noop{}
168 : USERVER_NAMESPACE::logging::LogHelper(
169 USERVER_NAMESPACE::logging::GetDefaultLogger(),
170 USERVER_NAMESPACE::logging::Level::kTrace,
171 USERVER_NAMESPACE::utils::impl::SourceLocation::Custom(0
, {}, {})
176#define USERVER_IMPL_LOGS_TRACE_ERASER(X) USERVER_IMPL_ERASE_LOG
178#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 0
180#define USERVER_IMPL_LOGS_DEBUG_ERASER(X) USERVER_IMPL_ERASE_LOG
183#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 1
185#define USERVER_IMPL_LOGS_INFO_ERASER(X) USERVER_IMPL_ERASE_LOG
188#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 2
190#define USERVER_IMPL_LOGS_WARNING_ERASER(X) USERVER_IMPL_ERASE_LOG
193#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 3
195#define USERVER_IMPL_LOGS_ERROR_ERASER(X) USERVER_IMPL_ERASE_LOG
200#ifndef USERVER_IMPL_LOGS_TRACE_ERASER
202#define USERVER_IMPL_LOGS_TRACE_ERASER(X) X
205#ifndef USERVER_IMPL_LOGS_DEBUG_ERASER
207#define USERVER_IMPL_LOGS_DEBUG_ERASER(X) X
210#ifndef USERVER_IMPL_LOGS_INFO_ERASER
212#define USERVER_IMPL_LOGS_INFO_ERASER(X) X
215#ifndef USERVER_IMPL_LOGS_WARNING_ERASER
217#define USERVER_IMPL_LOGS_WARNING_ERASER(X) X
220#ifndef USERVER_IMPL_LOGS_ERROR_ERASER
222#define USERVER_IMPL_LOGS_ERROR_ERASER(X) X
226#define USERVER_IMPL_LOG_TO(logger, level, ...)
227 USERVER_NAMESPACE
::logging::LogHelper(logger, level, USERVER_NAMESPACE
::logging::LogClass::kLog)
228 .AsLvalue(__VA_ARGS__)
231#define USERVER_IMPL_DYNAMIC_DEBUG_ENTRY
232 []() noexcept -> const USERVER_NAMESPACE
::logging::impl::StaticLogEntry& {
234 static constexpr const char* Get() noexcept { return USERVER_FILEPATH.data(); }
236 const auto& entry = USERVER_NAMESPACE
::logging::impl::EntryStorage<NameHolder, __LINE__>::entry;
246#define LOG_TO(logger, lvl, ...)
248 USERVER_IMPL_DYNAMIC_DEBUG_ENTRY
().ShouldNotLog((logger), (lvl)),
249 static_cast<int>(lvl) < static_cast<int>(USERVER_NAMESPACE
::logging::Level::kInfo)
251 ? USERVER_NAMESPACE
::logging::impl::Noop{}
252 : USERVER_IMPL_LOG_TO
((logger), (lvl), __VA_ARGS__)
258#define LOG(lvl, ...) LOG_TO(USERVER_NAMESPACE
::logging::GetDefaultLogger(), (lvl), __VA_ARGS__)
263#define LOG_TRACE(...) USERVER_IMPL_LOGS_TRACE_ERASER
(LOG(USERVER_NAMESPACE
::logging::Level::kTrace, __VA_ARGS__))
268#define LOG_DEBUG(...) USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG(USERVER_NAMESPACE
::logging::Level::kDebug, __VA_ARGS__))
273#define LOG_INFO(...) USERVER_IMPL_LOGS_INFO_ERASER
(LOG(USERVER_NAMESPACE
::logging::Level::kInfo, __VA_ARGS__))
278#define LOG_WARNING(...) USERVER_IMPL_LOGS_WARNING_ERASER
(LOG(USERVER_NAMESPACE
::logging::Level::kWarning, __VA_ARGS__))
283#define LOG_ERROR(...) USERVER_IMPL_LOGS_ERROR_ERASER
(LOG(USERVER_NAMESPACE
::logging::Level::kError, __VA_ARGS__))
288#define LOG_CRITICAL(...) LOG(USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
295#define LOG_TRACE_TO(logger, ...)
296 USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kTrace, __VA_ARGS__))
301#define LOG_DEBUG_TO(logger, ...)
302 USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kDebug, __VA_ARGS__))
307#define LOG_INFO_TO(logger, ...)
308 USERVER_IMPL_LOGS_INFO_ERASER
(LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kInfo, __VA_ARGS__))
313#define LOG_WARNING_TO(logger, ...)
314 USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kWarning, __VA_ARGS__))
319#define LOG_ERROR_TO(logger, ...)
320 USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kError, __VA_ARGS__))
325#define LOG_CRITICAL_TO(logger, ...) LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
336#define LOG_LIMITED_TO(logger, lvl, ...)
337 for (USERVER_NAMESPACE
::logging::impl::RateLimiter log_limited_to_rl{
338 []() -> USERVER_NAMESPACE
::logging::impl::RateLimitData& {
339 thread_local USERVER_NAMESPACE
::logging::impl::RateLimitData rl_data;
344 log_limited_to_rl.ShouldLog();
345 log_limited_to_rl.SetShouldNotLog())
346 LOG_TO((logger), log_limited_to_rl.GetLevel(), __VA_ARGS__) << log_limited_to_rl
351#define LOG_LIMITED(lvl, ...) LOG_LIMITED_TO(USERVER_NAMESPACE
::logging::GetDefaultLogger(), (lvl), __VA_ARGS__)
357#define LOG_LIMITED_TRACE(...)
358 USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kTrace, __VA_ARGS__))
364#define LOG_LIMITED_DEBUG(...)
365 USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kDebug, __VA_ARGS__))
371#define LOG_LIMITED_INFO(...)
372 USERVER_IMPL_LOGS_INFO_ERASER
(LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kInfo, __VA_ARGS__))
378#define LOG_LIMITED_WARNING(...)
379 USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kWarning, __VA_ARGS__))
385#define LOG_LIMITED_ERROR(...)
386 USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kError, __VA_ARGS__))
392#define LOG_LIMITED_CRITICAL(...) LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
400#define LOG_LIMITED_TRACE_TO(logger, ...)
401 USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kTrace, __VA_ARGS__))
407#define LOG_LIMITED_DEBUG_TO(logger, ...)
408 USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kDebug, __VA_ARGS__))
414#define LOG_LIMITED_INFO_TO(logger, ...)
415 USERVER_IMPL_LOGS_INFO_ERASER
(LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kInfo, __VA_ARGS__))
421#define LOG_LIMITED_WARNING_TO(logger, ...)
422 USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kWarning, __VA_ARGS__))
428#define LOG_LIMITED_ERROR_TO(logger, ...)
429 USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kError, __VA_ARGS__))
435#define LOG_LIMITED_CRITICAL_TO(logger, ...)
436 LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)