2015-09-29 19:21:02 +00:00
|
|
|
#pragma once
|
2017-02-02 14:19:13 +00:00
|
|
|
|
|
|
|
/// Macros for convenient usage of Poco logger.
|
2015-09-29 19:21:02 +00:00
|
|
|
|
|
|
|
#include <sstream>
|
2020-05-22 10:58:29 +00:00
|
|
|
#include <fmt/format.h>
|
2015-09-29 19:21:02 +00:00
|
|
|
#include <Poco/Logger.h>
|
2019-07-10 12:19:17 +00:00
|
|
|
#include <Poco/Message.h>
|
2019-07-16 08:36:50 +00:00
|
|
|
#include <Poco/Version.h>
|
2019-07-09 10:39:05 +00:00
|
|
|
#include <Common/CurrentThread.h>
|
2015-09-29 19:21:02 +00:00
|
|
|
|
|
|
|
|
2020-05-22 10:58:29 +00:00
|
|
|
/// TODO Remove this.
|
2015-09-29 19:21:02 +00:00
|
|
|
using Poco::Logger;
|
2019-07-10 12:19:17 +00:00
|
|
|
using Poco::Message;
|
2019-07-08 11:41:54 +00:00
|
|
|
using DB::LogsLevel;
|
2019-07-09 10:39:05 +00:00
|
|
|
using DB::CurrentThread;
|
2019-07-08 11:41:54 +00:00
|
|
|
|
2015-09-29 19:21:02 +00:00
|
|
|
/// Logs a message to a specified logger with that level.
|
|
|
|
|
2020-05-22 10:58:29 +00:00
|
|
|
#define LOG_IMPL(logger, priority, PRIORITY, message) do \
|
2019-08-04 15:53:12 +00:00
|
|
|
{ \
|
|
|
|
const bool is_clients_log = (CurrentThread::getGroup() != nullptr) && \
|
|
|
|
(CurrentThread::getGroup()->client_logs_level >= (priority)); \
|
|
|
|
if ((logger)->is((PRIORITY)) || is_clients_log) \
|
|
|
|
{ \
|
|
|
|
std::stringstream oss_internal_rare; \
|
|
|
|
oss_internal_rare << message; \
|
|
|
|
if (auto channel = (logger)->getChannel()) \
|
|
|
|
{ \
|
|
|
|
std::string file_function; \
|
|
|
|
file_function += __FILE__; \
|
|
|
|
file_function += "; "; \
|
|
|
|
file_function += __PRETTY_FUNCTION__; \
|
|
|
|
Message poco_message((logger)->name(), oss_internal_rare.str(), \
|
|
|
|
(PRIORITY), file_function.c_str(), __LINE__); \
|
|
|
|
channel->log(poco_message); \
|
|
|
|
} \
|
|
|
|
} \
|
2019-07-16 16:45:24 +00:00
|
|
|
} while (false)
|
2019-07-16 16:27:42 +00:00
|
|
|
|
2019-07-15 15:25:32 +00:00
|
|
|
|
2020-05-22 10:58:29 +00:00
|
|
|
#define LOG_TRACE(logger, message) LOG_IMPL(logger, LogsLevel::trace, Message::PRIO_TRACE, message)
|
|
|
|
#define LOG_DEBUG(logger, message) LOG_IMPL(logger, LogsLevel::debug, Message::PRIO_DEBUG, message)
|
|
|
|
#define LOG_INFO(logger, message) LOG_IMPL(logger, LogsLevel::information, Message::PRIO_INFORMATION, message)
|
|
|
|
#define LOG_WARNING(logger, message) LOG_IMPL(logger, LogsLevel::warning, Message::PRIO_WARNING, message)
|
|
|
|
#define LOG_ERROR(logger, message) LOG_IMPL(logger, LogsLevel::error, Message::PRIO_ERROR, message)
|
|
|
|
#define LOG_FATAL(logger, message) LOG_IMPL(logger, LogsLevel::error, Message::PRIO_FATAL, message)
|
2019-07-15 15:25:32 +00:00
|
|
|
|
2020-05-22 10:58:29 +00:00
|
|
|
|
|
|
|
#define LOG_IMPL_FORMATTED(logger, priority, PRIORITY, message, ...) do \
|
|
|
|
{ \
|
|
|
|
const bool is_clients_log = (CurrentThread::getGroup() != nullptr) && \
|
|
|
|
(CurrentThread::getGroup()->client_logs_level >= (priority)); \
|
|
|
|
if ((logger)->is((PRIORITY)) || is_clients_log) \
|
|
|
|
{ \
|
|
|
|
std::string formatted_message = fmt::format(message, __VA_ARGS__); \
|
|
|
|
if (auto channel = (logger)->getChannel()) \
|
|
|
|
{ \
|
|
|
|
std::string file_function; \
|
|
|
|
file_function += __FILE__; \
|
|
|
|
file_function += "; "; \
|
|
|
|
file_function += __PRETTY_FUNCTION__; \
|
|
|
|
Message poco_message((logger)->name(), formatted_message, \
|
|
|
|
(PRIORITY), file_function.c_str(), __LINE__); \
|
|
|
|
channel->log(poco_message); \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
} while (false)
|
|
|
|
|
|
|
|
|
|
|
|
#define LOG_TRACE_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::trace, Message::PRIO_TRACE, message, __VA_ARGS__)
|
|
|
|
#define LOG_DEBUG_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::debug, Message::PRIO_DEBUG, message, __VA_ARGS__)
|
|
|
|
#define LOG_INFO_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::information, Message::PRIO_INFORMATION, message, __VA_ARGS__)
|
|
|
|
#define LOG_WARNING_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::warning, Message::PRIO_WARNING, message, __VA_ARGS__)
|
|
|
|
#define LOG_ERROR_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::error, Message::PRIO_ERROR, message, __VA_ARGS__)
|
|
|
|
#define LOG_FATAL_FORMATTED(logger, message, ...) LOG_IMPL_FORMATTED(logger, LogsLevel::error, Message::PRIO_FATAL, message, __VA_ARGS__)
|