项目中需要记录log以及读写json,对比后选择了spdlog以及rapidjson。
SPDLog
对于log只是要求能够记录到文件中以及能够过滤,选择spdlog是因为这个只需要包含头文件即可使用,不依赖第三方库,使用简单,而且功能全面,至少足够目前使用。
用法:
下载【https://github.com/gabime/spdlog】文件后拷贝到项目工程目录,直接include即可。
1 std::shared_ptr<spdlog::logger> logger; 2 logger = spdlog::basic_logger_mt("basic_logger", "DLLLog.txt"); 3 logger->set_level(spdlog::level::debug); 4 logger->info("Start DLL");
有若干个level,
enum level_enum {trace = 0,debug = 1,info = 2,warn = 3,err = 4,critical = 5,off = 6 };
通过set_level进行过滤,只会显示超过setlevel 的log。
Rapidjson
也是不依赖第三方库的,只需要下载后#include后就可使用。
用法:
下载【https://github.com/Tencent/rapidjson/】,#include,然后就可以使用。
主要用来读写json文件,而读写文件也是通过转换为一个jsonstring来做的,即读取文件到一个string,然后操作该string解析为document,需要写入时候将Document序列化为一个string,将该string写入到文件。
rapidjson::Document ToolBox::ReadJsonFromFile(const std::string& filename) {rapidjson::Document ret;ifstream ifs(filename);string jsonstr = "";string line;if (ifs){while ((getline(ifs, line))){jsonstr += line;}} ret.Parse(jsonstr.c_str());ifs.close();return ret; }
int ToolBox::WriteDocumentToFile(const rapidjson::Document& sourcedata, const std::string& filename) {int ret = 0;ofstream ifs(filename);if (!ifs){ret = -1;return ret;}string jsonstr = "";StringBuffer buffer;Writer<StringBuffer> writer(buffer);sourcedata.Accept(writer);jsonstr = buffer.GetString();ifs << jsonstr;ifs.close();return ret; }
得到document后可以通过HasParseError()验证是否解析出错,通过HasMember("XXX")检验是否有该成员,有了就可以操作。需要注意的是如果要修改值,变量不能直接赋值,需要下面方式实现:
d["XXX"].SetString(StringRef(this->XXX.c_str()));