#ifndef FMTLOG_H #define FMTLOG_H #include // #include "fmt/format.h" // #include "fmt/chrono.h" // #include "fmt/color.h" #include "fmt/bundled/format.h" #include "chrono.h" #include "fmt/bundled/color.h" #include /** * 说明:使用方式和使用fmt的print方式一样 * 输出格式如下 * [2024-09-01 23:10:50][widget.cpp:52] 你好 */ /* 取出文件名的正则表达式 */ #if defined (_WIN32) static const std::regex _reg_file(R"(.*\\([\S]*[\.][\S]*)$)"); #elif defined(__linux__) static const std::regex _reg_file(R"(.*/([\S]*[\.][\S]*)$)"); #endif /* Debug输出 */ #define FMTLOG_DEBUG(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::blue), "[{}][{}][{}:{}] {}\n", _log_time, "DEBUG", _log_file , __LINE__ , _log_str); \ }while(0) /* 正常输出 */ #define FMTLOG_INFO(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::green), "[{}][{}][{}:{}] {}\n", _log_time, "INFO", _log_file, __LINE__, _log_str); \ }while(0) /* Warn输出 */ #define FMTLOG_WARN(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::yellow), "[{}][{}][{}:{}] {}\n", _log_time, "WARN", _log_file, __LINE__, _log_str); \ }while(0) /* 错误输出 */ #define FMTLOG_ERROR(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::red), "[{}][{}][{}:{}] {}\n", _log_time, "ERROR", _log_file, __LINE__, _log_str); \ }while(0) /******************** 不输出换行符 *********************/ /* Debug输出 */ #define FMTLOG_DEBUG_NON(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::blue), "[{}][{}][{}:{}] {}", _log_time, "DEBUG", _log_file , __LINE__ , _log_str); \ }while(0) /* 正常输出 */ #define FMTLOG_INFO_NON(...) \ do{ \ auto _now = std::chrono::system_clock::now(); \ std::time_t _now_c = std::chrono::system_clock::to_time_t(_now); \ std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(_now_c)); \ std::string _log_file_src = __FILE__; \ auto _log_file = std::regex_replace(_log_file_src, _reg_file, "$1"); \ std::string _log_str = fmt::format(__VA_ARGS__); \ fmt::print(fg(fmt::color::green), "[{}][{}][{}:{}] {}", _log_time, "INFO", _log_file, __LINE__, _log_str); \ }while(0) // void hello() // { // auto now = std::chrono::system_clock::now(); // std::time_t now_c = std::chrono::system_clock::to_time_t(now); // std::string _log_time = fmt::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(now_c)); // fmt::print(fg(fmt::color::green), "Hello, {}!\n", _log_time); // std::regex_replace("hello", _reg_file, "$1"); // fmt::format(fg(fmt::color::green), "Hello, {}!\n", _log_time); // } /** * @brief 采用单例模式 * */ // class FmtLog // { // private: // FmtLog(); // FmtLog(const FmtLog &fl) = delete; // FmtLog &operator=(const FmtLog &fl) = delete; // public: // ~FmtLog(); // static FmtLog& getInstance() // { // static FmtLog fl; // return fl; // } // /* */ // private: // /* 子线程函数,处理字符串 */ // void threadProcessStr(); // private: // }; #endif /* FMTLOG_H */