#ifndef INCLUDE_CCAPI_CPP_CCAPI_LOGGER_H_ #define INCLUDE_CCAPI_CPP_CCAPI_LOGGER_H_ #ifdef _WIN32 #define CCAPI_LOGGER_FILE_SEPARATOR '\\' #else #define CCAPI_LOGGER_FILE_SEPARATOR '/' #endif #define CCAPI_LOGGER_FILE_NAME (strrchr(__FILE__, CCAPI_LOGGER_FILE_SEPARATOR) ? strrchr(__FILE__, CCAPI_LOGGER_FILE_SEPARATOR) + 1 : __FILE__) #define CCAPI_LOGGER_LINE_NUMBER std::to_string(__LINE__) #define CCAPI_LOGGER_THREAD_ID std::this_thread::get_id() #define CCAPI_LOGGER_NOW std::chrono::system_clock::now() #if defined(CCAPI_ENABLE_LOG_FATAL) || defined(CCAPI_ENABLE_LOG_ERROR) || defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || \ defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_FATAL(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->fatal(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ throw std::runtime_error(message); \ } #else #define CCAPI_LOGGER_FATAL(message) throw std::runtime_error(message) #endif #if defined(CCAPI_ENABLE_LOG_ERROR) || defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || \ defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_ERROR(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->error(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ } #else #define CCAPI_LOGGER_ERROR(message) #endif #if defined(CCAPI_ENABLE_LOG_WARN) || defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_WARN(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->warn(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ } #else #define CCAPI_LOGGER_WARN(message) #endif #if defined(CCAPI_ENABLE_LOG_INFO) || defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_INFO(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->info(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ } #else #define CCAPI_LOGGER_INFO(message) #endif #if defined(CCAPI_ENABLE_LOG_DEBUG) || defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_DEBUG(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->debug(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ } #else #define CCAPI_LOGGER_DEBUG(message) #endif #if defined(CCAPI_ENABLE_LOG_TRACE) #define CCAPI_LOGGER_TRACE(message) \ if (::ccapi::Logger::logger) { \ ::ccapi::Logger::logger->trace(CCAPI_LOGGER_THREAD_ID, CCAPI_LOGGER_NOW, CCAPI_LOGGER_FILE_NAME, CCAPI_LOGGER_LINE_NUMBER, message); \ } #else #define CCAPI_LOGGER_TRACE(message) #endif #ifdef __GNUC__ #define __ccapi_cpp_func__ __PRETTY_FUNCTION__ #else #define __ccapi_cpp_func__ __func__ #endif #define CCAPI_LOGGER_FUNCTION_ENTER CCAPI_LOGGER_TRACE(std::string("enter ") + std::string(__ccapi_cpp_func__)) #define CCAPI_LOGGER_FUNCTION_EXIT CCAPI_LOGGER_TRACE(std::string("exit ") + std::string(__ccapi_cpp_func__)) #include #include #include #include #include "ccapi_cpp/ccapi_macro.h" #include "ccapi_cpp/ccapi_util_private.h" namespace ccapi { /** * This class is used for library logging. */ class Logger { public: std::string LOG_SEVERITY_FATAL = "FATAL"; std::string LOG_SEVERITY_ERROR = "ERROR"; std::string LOG_SEVERITY_WARN = "WARN"; std::string LOG_SEVERITY_INFO = "INFO"; std::string LOG_SEVERITY_DEBUG = "DEBUG"; std::string LOG_SEVERITY_TRACE = "TRACE"; virtual ~Logger() {} void fatal(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_FATAL, threadId, time, fileName, lineNumber, message); } void error(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_ERROR, threadId, time, fileName, lineNumber, message); } void warn(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_WARN, threadId, time, fileName, lineNumber, message); } void info(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_INFO, threadId, time, fileName, lineNumber, message); } void debug(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_DEBUG, threadId, time, fileName, lineNumber, message); } void trace(const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { this->logMessagePrivate(LOG_SEVERITY_TRACE, threadId, time, fileName, lineNumber, message); } static Logger* logger; virtual void logMessage(const std::string& severity, const std::string& threadId, const std::string& timeISO, const std::string& fileName, const std::string& lineNumber, const std::string& message) {} #ifndef CCAPI_EXPOSE_INTERNAL protected: #endif void logMessagePrivate(const std::string& severity, const std::thread::id& threadId, const std::chrono::system_clock::time_point& time, const std::string& fileName, const std::string& lineNumber, const std::string& message) { std::stringstream ss; ss << threadId; this->logMessage(severity, ss.str(), UtilTime::getISOTimestamp(time), fileName, lineNumber, message); } }; } /* namespace ccapi */ #endif // INCLUDE_CCAPI_CPP_CCAPI_LOGGER_H_