ClickHouse/src/Common/logger_useful.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

57 lines
3.5 KiB
C++
Raw Normal View History

#pragma once
/// Macros for convenient usage of Poco logger.
2020-05-22 10:58:29 +00:00
#include <fmt/format.h>
#include <Poco/Logger.h>
2019-07-10 12:19:17 +00:00
#include <Poco/Message.h>
2019-07-09 10:39:05 +00:00
#include <Common/CurrentThread.h>
2020-05-29 00:09:12 +00:00
namespace
{
template <typename... Ts> constexpr size_t numArgs(Ts &&...) { return sizeof...(Ts); }
template <typename T, typename... Ts> constexpr auto firstArg(T && x, Ts &&...) { return std::forward<T>(x); }
/// For implicit conversion of fmt::basic_runtime<> to char* for std::string ctor
template <typename T, typename... Ts> constexpr auto firstArg(fmt::basic_runtime<T> && data, Ts &&...) { return data.str.data(); }
2020-05-29 00:09:12 +00:00
[[maybe_unused]] const ::Poco::Logger * getLogger(const ::Poco::Logger * logger) { return logger; };
[[maybe_unused]] const ::Poco::Logger * getLogger(const std::atomic<::Poco::Logger *> & logger) { return logger.load(); };
}
2020-05-29 00:09:12 +00:00
/// Logs a message to a specified logger with that level.
2020-05-29 00:09:12 +00:00
/// If more than one argument is provided,
/// the first argument is interpreted as template with {}-substitutions
/// and the latter arguments treat as values to substitute.
/// If only one argument is provided, it is threat as message without substitutions.
2020-05-29 00:09:12 +00:00
#define LOG_IMPL(logger, priority, PRIORITY, ...) do \
2020-05-22 10:58:29 +00:00
{ \
auto _logger = ::getLogger(logger); \
const bool _is_clients_log = (DB::CurrentThread::getGroup() != nullptr) && \
2020-05-30 21:57:37 +00:00
(DB::CurrentThread::getGroup()->client_logs_level >= (priority)); \
if (_logger->is((PRIORITY)) || _is_clients_log) \
2020-05-22 10:58:29 +00:00
{ \
2020-05-29 00:09:12 +00:00
std::string formatted_message = numArgs(__VA_ARGS__) > 1 ? fmt::format(__VA_ARGS__) : firstArg(__VA_ARGS__); \
if (auto _channel = _logger->getChannel()) \
2020-05-22 10:58:29 +00:00
{ \
std::string file_function; \
file_function += __FILE__; \
file_function += "; "; \
file_function += __PRETTY_FUNCTION__; \
Poco::Message poco_message(_logger->name(), formatted_message, \
2020-05-22 10:58:29 +00:00
(PRIORITY), file_function.c_str(), __LINE__); \
_channel->log(poco_message); \
2020-05-22 10:58:29 +00:00
} \
} \
} while (false)
2021-09-03 10:07:40 +00:00
#define LOG_TEST(logger, ...) LOG_IMPL(logger, DB::LogsLevel::test, Poco::Message::PRIO_TEST, __VA_ARGS__)
2020-05-30 21:57:37 +00:00
#define LOG_TRACE(logger, ...) LOG_IMPL(logger, DB::LogsLevel::trace, Poco::Message::PRIO_TRACE, __VA_ARGS__)
#define LOG_DEBUG(logger, ...) LOG_IMPL(logger, DB::LogsLevel::debug, Poco::Message::PRIO_DEBUG, __VA_ARGS__)
#define LOG_INFO(logger, ...) LOG_IMPL(logger, DB::LogsLevel::information, Poco::Message::PRIO_INFORMATION, __VA_ARGS__)
#define LOG_WARNING(logger, ...) LOG_IMPL(logger, DB::LogsLevel::warning, Poco::Message::PRIO_WARNING, __VA_ARGS__)
#define LOG_ERROR(logger, ...) LOG_IMPL(logger, DB::LogsLevel::error, Poco::Message::PRIO_ERROR, __VA_ARGS__)
#define LOG_FATAL(logger, ...) LOG_IMPL(logger, DB::LogsLevel::error, Poco::Message::PRIO_FATAL, __VA_ARGS__)