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 explicit RateLimiter(RateLimitData& data)
noexcept;
119 bool ShouldLog()
const noexcept {
return should_log_; }
120 auto GetDroppedCount()
const noexcept {
return dropped_count_; }
121 friend LogHelper& operator<<(LogHelper& lh,
const RateLimiter& rl)
noexcept;
124 bool should_log_{
true};
125 uint64_t dropped_count_{0};
129class StaticLogEntry
final {
131 StaticLogEntry(
const char* path,
int line)
noexcept;
133 StaticLogEntry(StaticLogEntry&&) =
delete;
134 StaticLogEntry& operator=(StaticLogEntry&&) =
delete;
136 bool ShouldNotLog(LoggerRef logger,
Level level)
const noexcept;
137 bool ShouldNotLog(
const LoggerPtr& logger,
Level level)
const noexcept;
140 static constexpr std::size_t kContentSize =
compiler::SelectSize().For64Bit(40).For32Bit(24);
142 alignas(
void*) std::byte content_[kContentSize];
145template <
class NameHolder,
int Line>
146struct EntryStorage
final {
147 static inline StaticLogEntry entry{NameHolder::Get(), Line};
160#ifdef USERVER_FEATURE_ERASE_LOG_WITH_LEVEL
166#define USERVER_IMPL_ERASE_LOG(logger, ...)
168 ? logging::impl::Noop{}
169 : USERVER_NAMESPACE::logging::LogHelper(
171 USERVER_NAMESPACE::logging::Level::kTrace,
172 USERVER_NAMESPACE::logging::LogClass::kLog,
173 USERVER_NAMESPACE::utils::impl::SourceLocation::Custom(0
, {}, {})
175 .AsLvalue(__VA_ARGS__)
177#define USERVER_IMPL_LOGS_TRACE_ERASER(MACRO, LOGGER, ...) USERVER_IMPL_ERASE_LOG(LOGGER, __VA_ARGS__)
179#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 0
180#define USERVER_IMPL_LOGS_DEBUG_ERASER(MACRO, LOGGER, ...) USERVER_IMPL_ERASE_LOG(LOGGER, __VA_ARGS__)
183#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 1
184#define USERVER_IMPL_LOGS_INFO_ERASER(MACRO, LOGGER, ...) USERVER_IMPL_ERASE_LOG(LOGGER, __VA_ARGS__)
187#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 2
188#define USERVER_IMPL_LOGS_WARNING_ERASER(MACRO, LOGGER, ...) USERVER_IMPL_ERASE_LOG(LOGGER, __VA_ARGS__)
191#if USERVER_FEATURE_ERASE_LOG_WITH_LEVEL > 3
192#define USERVER_IMPL_LOGS_ERROR_ERASER(MACRO, LOGGER, ...) USERVER_IMPL_ERASE_LOG(LOGGER, __VA_ARGS__)
197#ifndef USERVER_IMPL_LOGS_TRACE_ERASER
198#define USERVER_IMPL_LOGS_TRACE_ERASER(MACRO, LOGGER, ...)
199 MACRO(LOGGER, USERVER_NAMESPACE
::logging::Level::kTrace, __VA_ARGS__)
202#ifndef USERVER_IMPL_LOGS_DEBUG_ERASER
203#define USERVER_IMPL_LOGS_DEBUG_ERASER(MACRO, LOGGER, ...)
204 MACRO(LOGGER, USERVER_NAMESPACE
::logging::Level::kDebug, __VA_ARGS__)
207#ifndef USERVER_IMPL_LOGS_INFO_ERASER
208#define USERVER_IMPL_LOGS_INFO_ERASER(MACRO, LOGGER, ...)
209 MACRO(LOGGER, USERVER_NAMESPACE
::logging::Level::kInfo, __VA_ARGS__)
212#ifndef USERVER_IMPL_LOGS_WARNING_ERASER
213#define USERVER_IMPL_LOGS_WARNING_ERASER(MACRO, LOGGER, ...)
214 MACRO(LOGGER, USERVER_NAMESPACE
::logging::Level::kWarning, __VA_ARGS__)
217#ifndef USERVER_IMPL_LOGS_ERROR_ERASER
218#define USERVER_IMPL_LOGS_ERROR_ERASER(MACRO, LOGGER, ...)
219 MACRO(LOGGER, USERVER_NAMESPACE
::logging::Level::kError, __VA_ARGS__)
222#define USERVER_IMPL_LOG_TO(logger, level, ...)
223 USERVER_NAMESPACE
::logging::LogHelper(logger, level, USERVER_NAMESPACE
::logging::LogClass::kLog)
224 .AsLvalue(__VA_ARGS__)
226#define USERVER_IMPL_DYNAMIC_DEBUG_ENTRY
227 []() noexcept -> const USERVER_NAMESPACE
::logging::impl::StaticLogEntry& {
229 static constexpr const char* Get() noexcept { return USERVER_FILEPATH.c_str(); }
231 const auto& entry = USERVER_NAMESPACE
::logging::impl::EntryStorage<NameHolder, __LINE__>::entry;
244#define LOG_TO(logger, lvl, ...)
246 USERVER_IMPL_DYNAMIC_DEBUG_ENTRY
().ShouldNotLog((logger), (lvl)),
247 static_cast<int>(lvl) < static_cast<int>(USERVER_NAMESPACE
::logging::Level::kInfo)
249 ? USERVER_NAMESPACE
::logging::impl::Noop{}
250 : USERVER_IMPL_LOG_TO
((logger), (lvl), __VA_ARGS__)
259#define LOG(lvl, ...) LOG_TO(USERVER_NAMESPACE
::logging::GetDefaultLogger(), (lvl), __VA_ARGS__)
267#define LOG_TRACE(...)
268 USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
276#define LOG_DEBUG(...)
277 USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
285#define LOG_INFO(...) USERVER_IMPL_LOGS_INFO_ERASER
(LOG_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
293#define LOG_WARNING(...)
294 USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
302#define LOG_ERROR(...)
303 USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
311#define LOG_CRITICAL(...) LOG(USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
321#define LOG_TRACE_TO(logger, ...) USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_TO, logger, __VA_ARGS__)
329#define LOG_DEBUG_TO(logger, ...) USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_TO, logger, __VA_ARGS__)
337#define LOG_INFO_TO(logger, ...) USERVER_IMPL_LOGS_INFO_ERASER
(LOG_TO, logger, __VA_ARGS__)
345#define LOG_WARNING_TO(logger, ...) USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_TO, logger, __VA_ARGS__)
353#define LOG_ERROR_TO(logger, ...) USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_TO, logger, __VA_ARGS__)
361#define LOG_CRITICAL_TO(logger, ...) LOG_TO(logger, USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
368#define LOG_LIMITED_TO(logger, lvl, ...)
369 if (const USERVER_NAMESPACE
::logging::impl::RateLimiter
370 userver_log_limited_to_rl{[]() -> USERVER_NAMESPACE
::logging::impl::RateLimitData& {
371 thread_local USERVER_NAMESPACE
::logging::impl::RateLimitData rl_data;
374 !userver_log_limited_to_rl.ShouldLog())
377 LOG_TO((logger), (lvl), __VA_ARGS__) << userver_log_limited_to_rl
385#define LOG_LIMITED(lvl, ...) LOG_LIMITED_TO(USERVER_NAMESPACE
::logging::GetDefaultLogger(), (lvl), __VA_ARGS__)
394#define LOG_LIMITED_TRACE(...)
395 USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_LIMITED_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
404#define LOG_LIMITED_DEBUG(...)
405 USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_LIMITED_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
414#define LOG_LIMITED_INFO(...)
415 USERVER_IMPL_LOGS_INFO_ERASER
(LOG_LIMITED_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
424#define LOG_LIMITED_WARNING(...)
425 USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_LIMITED_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
434#define LOG_LIMITED_ERROR(...)
435 USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_LIMITED_TO, USERVER_NAMESPACE
::logging::GetDefaultLogger(), __VA_ARGS__)
444#define LOG_LIMITED_CRITICAL(...) LOG_LIMITED(USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)
454#define LOG_LIMITED_TRACE_TO(logger, ...) USERVER_IMPL_LOGS_TRACE_ERASER
(LOG_LIMITED_TO, logger, __VA_ARGS__)
462#define LOG_LIMITED_DEBUG_TO(logger, ...) USERVER_IMPL_LOGS_DEBUG_ERASER
(LOG_LIMITED_TO, logger, __VA_ARGS__)
470#define LOG_LIMITED_INFO_TO(logger, ...) USERVER_IMPL_LOGS_INFO_ERASER
(LOG_LIMITED_TO, logger, __VA_ARGS__)
478#define LOG_LIMITED_WARNING_TO(logger, ...) USERVER_IMPL_LOGS_WARNING_ERASER
(LOG_LIMITED_TO, logger, __VA_ARGS__)
486#define LOG_LIMITED_ERROR_TO(logger, ...) USERVER_IMPL_LOGS_ERROR_ERASER
(LOG_LIMITED_TO, logger, __VA_ARGS__)
494#define LOG_LIMITED_CRITICAL_TO(logger, ...)
495 LOG_LIMITED_TO(logger, USERVER_NAMESPACE
::logging::Level::kCritical, __VA_ARGS__)