// SPDX-FileCopyrightText: 2024 Yury Gubich // SPDX-License-Identifier: GPL-3.0-or-later #include "logger.h" #include #include static constexpr std::string_view logLevelMap[] = { "DEBUG", // 0 "WARNING", // 1 "ERROR", // 2 }; static constexpr std::string_view colorMap[] = { "\033[32m", // DEBUG (Green) "\033[33m", // WARNING (Yellow) "\033[31m", // ERROR (Red) }; static constexpr std::string_view clear = "\033[0m"; static constexpr std::string_view bold = "\033[1m"; void writeTimestamp() { std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); std::time_t time_now = std::chrono::system_clock::to_time_t(now); std::tm local_time = *std::localtime(&time_now); std::chrono::milliseconds millis = std::chrono::duration_cast(now.time_since_epoch()) % 1000; std::cout << "\033[90m" << std::put_time(&local_time, "%Y-%m-%d %H:%M:%S"); std::cout << "." << std::setfill('0') << std::setw(3) << millis.count(); std::cout << clear << ' '; } constexpr std::string_view getLogLevel(gloox::LogLevel level) { return (level >= 0 && level < 3) ? logLevelMap[level] : "UNKNOWN"; } constexpr std::string_view getColor(gloox::LogLevel level) { return (level >= 0 && level < 3) ? colorMap[level] : ""; } void writeTags(gloox::LogArea area) { if (area & gloox::LogAreaClassParser) std::cout << " [Parser]"; if (area & gloox::LogAreaClassConnectionTCPBase) std::cout << " [Connection]"; if (area & gloox::LogAreaClassClient) std::cout << " [Client]"; if (area & gloox::LogAreaClassClientbase) std::cout << " [Client Base]"; if (area & gloox::LogAreaClassComponent) std::cout << " [Component]"; if (area & gloox::LogAreaClassDns) std::cout << " [DNS]"; if (area & gloox::LogAreaClassConnectionHTTPProxy) std::cout << " [HTTP Proxy]"; if (area & gloox::LogAreaClassConnectionSOCKS5Proxy) std::cout << " [SOCKS5 Proxy]"; if (area & gloox::LogAreaClassConnectionTCPClient) std::cout << " [TCP Client]"; if (area & gloox::LogAreaClassConnectionTCPServer) std::cout << " [TCP Server]"; if (area & gloox::LogAreaClassS5BManager) std::cout << " [SOCKS5 Bytestream Manager]"; if (area & gloox::LogAreaClassSOCKS5Bytestream) std::cout << " [SOCKS5 Bytestream]"; if (area & gloox::LogAreaLinkLocalManager) std::cout << " [Link Local Manager]"; if (area & gloox::LogAreaXmlIncoming) std::cout << " \033[1;36m[XML IN]"; if (area & gloox::LogAreaXmlOutgoing) std::cout << " \033[1;35m[XML OUT]"; if (area & gloox::LogAreaUser) std::cout << " [USER]"; if (area == gloox::LogAreaClassDns) std::cout << '\t'; } Logger::Logger(gloox::LogSink& sink, gloox::LogLevel level): sink(sink) { sink.registerLogHandler(level, gloox::LogAreaAll, this); } Logger::~Logger() { sink.removeLogHandler(this); } void Logger::handleLog(gloox::LogLevel level, gloox::LogArea area, const std::string& message) { writeTimestamp(); std::cout << getColor(level) << bold << "[" << getLogLevel(level) << "]" << clear << bold; writeTags(area); std::cout << clear << '\t' << message << clear << std::endl; }