7 #include <spdlog/fmt/fmt.h>
8 #include <spdlog/fmt/ostr.h>
9 #include <spdlog/sinks/stdout_color_sinks.h>
10 #include <spdlog/spdlog.h>
13 #if !defined(FMT_VERSION) || FMT_VERSION < 90000
26 template <
typename OStream,
typename T>
33 template <
typename OStream,
typename T>
35 if (s.value.has_value()) {
72 static std::shared_ptr<spdlog::logger>
get(
const std::string &name =
"doip", spdlog::level::level_enum level = spdlog::level::info) {
73 static std::mutex mutex;
74 std::lock_guard<std::mutex> lock(mutex);
76 if (
auto it = m_loggers.find(name); it != m_loggers.end()) {
80 auto new_log = spdlog::stdout_color_mt(name);
81 new_log->set_level(level);
83 m_loggers.emplace(name, new_log);
87 static std::shared_ptr<spdlog::logger>
getUdp() {
91 static std::shared_ptr<spdlog::logger>
getTcp() {
95 static void setLevel(spdlog::level::level_enum level) {
96 get()->set_level(level);
100 get()->set_pattern(pattern);
104 const char *term = std::getenv(
"TERM");
105 const char *colorterm = std::getenv(
"COLORTERM");
110 std::string termStr(term);
111 return termStr.find(
"color") != std::string::npos ||
112 termStr.find(
"xterm") != std::string::npos ||
113 termStr.find(
"screen") != std::string::npos ||
114 colorterm !=
nullptr;
118 static std::unordered_map<std::string, std::shared_ptr<spdlog::logger>> m_loggers;
124 #define LOG_DOIP_TRACE(...) doip::Logger::get()->trace(__VA_ARGS__)
125 #define LOG_DOIP_DEBUG(...) doip::Logger::get()->debug(__VA_ARGS__)
126 #define LOG_DOIP_INFO(...) doip::Logger::get()->info(__VA_ARGS__)
127 #define LOG_DOIP_WARN(...) doip::Logger::get()->warn(__VA_ARGS__)
128 #define LOG_DOIP_ERROR(...) doip::Logger::get()->error(__VA_ARGS__)
129 #define LOG_DOIP_CRITICAL(...) doip::Logger::get()->critical(__VA_ARGS__)
132 #define LOG_UDP_TRACE(...) doip::Logger::getUdp()->trace(__VA_ARGS__)
133 #define LOG_UDP_DEBUG(...) doip::Logger::getUdp()->debug(__VA_ARGS__)
134 #define LOG_UDP_INFO(...) doip::Logger::getUdp()->info(__VA_ARGS__)
135 #define LOG_UDP_WARN(...) doip::Logger::getUdp()->warn(__VA_ARGS__)
136 #define LOG_UDP_ERROR(...) doip::Logger::getUdp()->error(__VA_ARGS__)
137 #define LOG_UDP_CRITICAL(...) doip::Logger::getUdp()->critical(__VA_ARGS__)
140 #define LOG_TCP_TRACE(...) doip::Logger::getTcp()->trace(__VA_ARGS__)
141 #define LOG_TCP_DEBUG(...) doip::Logger::getTcp()->debug(__VA_ARGS__)
142 #define LOG_TCP_INFO(...) doip::Logger::getTcp()->info(__VA_ARGS__)
143 #define LOG_TCP_WARN(...) doip::Logger::getTcp()->warn(__VA_ARGS__)
144 #define LOG_TCP_ERROR(...) doip::Logger::getTcp()->error(__VA_ARGS__)
145 #define LOG_TCP_CRITICAL(...) doip::Logger::getTcp()->critical(__VA_ARGS__)
148 #define LOG_DOIP_SUCCESS(...) \
149 doip::Logger::get()->info(std::string(doip::ansi::bold_green) + fmt::format(__VA_ARGS__) + doip::ansi::reset)
151 #define LOG_DOIP_ERROR_COLORED(...) \
152 doip::Logger::get()->error(std::string(doip::ansi::bold_red) + fmt::format(__VA_ARGS__) + doip::ansi::reset)
154 #define LOG_DOIP_PROTOCOL(...) \
155 doip::Logger::get()->info(std::string(doip::ansi::bold_blue) + fmt::format(__VA_ARGS__) + doip::ansi::reset)
157 #define LOG_DOIP_CONNECTION(...) \
158 doip::Logger::get()->info(std::string(doip::ansi::bold_magenta) + fmt::format(__VA_ARGS__) + doip::ansi::reset)
160 #define LOG_DOIP_HIGHLIGHT(...) \
161 doip::Logger::get()->info(std::string(doip::ansi::bold_cyan) + fmt::format(__VA_ARGS__) + doip::ansi::reset)
165 #define LOG_DOIP_STREAM_INFO(obj, ...) LOG_DOIP_INFO(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)))
166 #define LOG_DOIP_STREAM_DEBUG(obj, ...) LOG_DOIP_DEBUG(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)))
167 #define LOG_DOIP_STREAM_WARN(obj, ...) LOG_DOIP_WARN(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)))
168 #define LOG_DOIP_STREAM_ERROR(obj, ...) LOG_DOIP_ERROR(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)))
171 #define LOG_DOIP_STREAM_SUCCESS(obj, ...) \
172 doip::Logger::get()->info(std::string(doip::ansi::bold_green) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset)
174 #define LOG_DOIP_STREAM_PROTOCOL(obj, ...) \
175 doip::Logger::get()->info(std::string(doip::ansi::bold_blue) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset)
177 #define LOG_DOIP_STREAM_CONNECTION(obj, ...) \
178 doip::Logger::get()->info(std::string(doip::ansi::bold_magenta) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset)
Centralized logger for the DoIP library.
static bool colorsSupported()
static void setLevel(spdlog::level::level_enum level)
static std::shared_ptr< spdlog::logger > getTcp()
static std::shared_ptr< spdlog::logger > getUdp()
static void setPattern(const std::string &pattern)
static std::shared_ptr< spdlog::logger > get(const std::string &name="doip", spdlog::level::level_enum level=spdlog::level::info)
constexpr const char * DEFAULT_PATTERN
constexpr const char * SHORT_PATTERN
Pattern for short output without timestamp.
OStream & operator<<(OStream &os, const streamed_t< T > &s)
streamed_t< T > streamed(const T &v)