#ifndef HUMANUSlogger_H #define HUMANUSlogger_H #include "spdlog/spdlog.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/daily_file_sink.h" #include "spdlog/sinks/dist_sink.h" #include namespace humanus { static spdlog::level::level_enum _print_level = spdlog::level::info; /** * @brief 调整日志级别 * @param print_level 控制台输出日志级别 * @param logfile_level 文件记录日志级别 * @param name 日志文件名前缀 * @return 日志记录器实例 */ std::shared_ptr define_log_level(spdlog::level::level_enum print_level = spdlog::level::info, spdlog::level::level_enum logfile_level = spdlog::level::debug, std::string name = "") { _print_level = print_level; auto current_date = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(current_date); std::stringstream ss; std::tm tm_info = *std::localtime(&in_time_t); ss << std::put_time(&tm_info, "%Y%m%d"); std::string formatted_date = ss.str(); // YYYYMMDD std::string log_name = name.empty() ? formatted_date : name + "_" + formatted_date; std::string log_file_path = (PROJECT_ROOT / "logs" / (log_name + ".log")).string(); // 确保日志目录存在 std::filesystem::create_directories((PROJECT_ROOT / "logs").string()); // 重置日志输出 std::shared_ptr _logger = spdlog::default_logger(); // 添加标准错误输出sink,相当于Python中的sys.stderr auto stderr_sink = std::make_shared(); stderr_sink->set_level(print_level); _logger->sinks().push_back(stderr_sink); // 添加文件sink,相当于Python中的PROJECT_ROOT / f"logs/{log_name}.log" auto file_sink = std::make_shared(log_file_path, true); file_sink->set_level(logfile_level); _logger->sinks().push_back(file_sink); return _logger; } static std::shared_ptr logger = define_log_level(); } // namespace humanus #endif