#include "LHLogInit.h" #include "spdlog/spdlog.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "LHLog_file_sink.h" #include #include /* 初始化spdlog,输入的是模组名称,可以为空 * lhQLog是一个全局函数,在库LHQLog中定义 * 这里获取可执行文件文件夹的路径,使用的是C++17新引入的特性 * GCC9会在标准库中,GCC8.3需要手动链接库stdc++fs才可以使用 */ void initLog(QString ModuleName, CLHQLogApi& lhQLog) { try { /* 创建一个文件sink,每天一个,00:00创建新的 */ // auto sink_file = std::make_shared("FlowChartLog/log.txt",0,0); /* 自定义的sink */ // std::filesystem::path execPath = std::filesystem::current_path(); std::string execPath = QApplication::applicationDirPath().toStdString(); #if defined(Q_OS_WIN32) #if C_DEBUG std::string libName = execPath + "/LHQLogd.dll"; #elif C_RELEASE std::string libName = execPath + "/LHQLog.dll"; #endif #elif defined(Q_OS_LINUX) std::string libName = execPath + "/libLHQLog.so"; #endif /* 给默认记录器用的sink */ auto sink_default = std::make_shared(); /* 创建一个控制台sink */ auto sink_consolse = std::make_shared(); /* 创建写入文件的sink */ auto sink_LHLog = std::make_shared(&lhQLog, QString(libName.c_str()), ModuleName); /* 修改输出格式 */ #if C_DEBUG sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v %$"); // sink_file->set_pattern("[%Y-%m-%d %H:%M:%S:%e] [%^%n%$] [%^%l%$] %s %#: %v"); sink_LHLog->set_pattern("%v"); sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e:%e] [%l] [%s %#] %v %$"); #elif C_RELEASE sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$"); // sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n]: %v %$"); sink_LHLog->set_pattern("%v"); sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] %v %$"); #endif /* 日志输出方向,终端和文件 */ std::vector sinks; sinks.push_back(sink_consolse); // sinks.push_back(sink_file); sinks.push_back(sink_LHLog); /* 设置默认日志记录器,设置成自定义的sink */ spdlog::default_logger()->sinks().clear(); spdlog::default_logger()->sinks().push_back(sink_default); spdlog::default_logger()->sinks().push_back(sink_LHLog); /* 创建一个标准输出 */ auto logger_main = std::make_shared("main",begin(sinks),end(sinks)); /* 创建一个WebAPI logger */ auto logger_WebAPI = std::make_shared("WebAPI",begin(sinks),end(sinks)); /* 注册到注册表 */ spdlog::register_logger(logger_main); spdlog::register_logger(logger_WebAPI); /* 设置spdlog输出级别,默认的估计不输出debug这个级别 * 这是默认的设置,可以在外面单数设置输出方式 * release模式下不输出console的日志输出 * */ #if defined (C_DEBUG) spdlog::set_level(spdlog::level::trace); spdlog::flush_on(spdlog::level::trace); #elif defined(C_RELEASE) spdlog::set_level(spdlog::level::info); /* 只输出info以上的输出 */ spdlog::flush_on(spdlog::level::info); /* 设置刷新等级 */ sink_consolse->set_level(spdlog::level::info); /* 控制台不输出 */ sink_default->set_level(spdlog::level::info); /* 默认sink也不输出 */ #endif // SPDLOG_LOGGER_DEBUG(logger_main,"******* 有行号且debug也能输出 *******"); } catch (const spdlog::spdlog_ex& ex) { qDebug() << "Log initialization failed: " << ex.what() ; } }