Easylogging
https://blog.csdn.net/woshichenweixian/article/details/77018452
#include "easylogging++.h" _INITIALIZE_EASYLOGGINGPP int _tmain(int argc, _TCHAR* argv[]) { LOG(INFO) << "My First Easylog!" ; return 0 ; }
Easyloggingpp的使用就是怎么简单。
* ALL: // We need to start level with star '*' and end with colon ':' FORMAT ="%level: %log" // Quotes are not necessary but to make it more readable we wrap quotes around. FILENAME = "logs/testLog.log" ENABLED =true TO_FILE =true TO_STANDARD_OUTPUT =false MILLISECONDS_WIDTH =3 PERFORMANCE_TRACKING =false ROLL_OUT_SIZE = 2097152 // Throw log files away after 2MB // Following configuration only defines FORMAT for INFO, rest of the configurations are used from ALL configurations above * INFO: FORMAT ="%datetime %level %log"
上面的配置配置了ALL等级和INFO等级,则除了INFO等级的FORMAT配置项外,其中配置都用ALL等级里面的(包括INFO等级的其他配置项和其他等级的全部配置项)。
easyloggingpp::Configurations confFromFile("myconfiguration_file"); // Load configuration from file easyloggingpp::Loggers::reconfigureAllLoggers(confFromFile); // Re-configures all the loggers to current configuration file
(2)内联的配置,即直接用std::string传递配置信息:
easyloggingpp::Configurations c; c.setToDefault(); c.parseFromText("*ALL:\nFORMAT = %level");
_INITIALIZE_EASYLOGGINGPP int main(int argc, const char** argv) { easyloggingpp::Configurations defaultConf; defaultConf.setToDefault(); defaultConf.set(easyloggingpp::Level::Info, easyloggingpp::ConfigurationType::Format, "%datetime %level %log"); // Values are always std::string easyloggingpp::Loggers::reconfigureLogger("business", defaultConf); // Business logger uses default configurations BINFO << "Log using default file"; // Log message: 01/01/2013 00:00:00.551 INFO Log using default file // To set ALL configuraions you may use defaultConf.setAll(easyloggingpp::ConfigurationType::Format, "%datetime %level %log"); easyloggingpp::Loggers::reconfigureLogger("business", defaultConf); // Business logger uses default configurations return 0; }
Easylogging的配置能力还有很多可以深究下去的,例如配置log格式是,有很多标识符可以用,例如:
%logger :调试器ID
%thread:线程ID
%level :log等级
%datetime:等
详细的信息可以参考Easylogging的README文件。
四.Easylogging的调试器(Logger)
######Trivial Logger
`LINFO`, `LDEBUG`, `LWARNING`, `LERROR`, `LFATAL`, `LQA`, `LTRACE`, `LVERBOSE`
例如:
LINFO << "the trival's info level logs" ;
`BINFO`, `BDEBUG`, `BWARNING`, `BERROR`, `BFATAL`, `BQA`, `BTRACE`, `BVERBOSE`
######Security Logger
`SINFO`, `SDEBUG`, `SWARNING`, `SERROR`, `SFATAL`, `SQA`, `STRACE`, `SVERBOSE`
######Performance Logger
`PINFO`, `PDEBUG`, `PWARNING`, `PERROR`, `PFATAL`, `PQA`, `PTRACE`, `PVERBOSE`
条件输出宏:
LDEBUG_IF(condition) << log
LINFO_IF(condition) << log
LWARNING_IF(condition) << log等宏,当()里面的条件成立时才输出对应的log,例如:
LINFO_IF(1 == 1) << "1 == 1 is true!" ;
LWARNING_EVERY_N(n) << log等宏,()里面的n表示该条log只有在没调用n次才会输出一次,
for(int i = 0 ; i < 6 ; ++i)
LINFO_EVERY_N(3) << "Every N Log" ;
则只有第三次和第六次才会输出log
六.扩展的类log输出
如果想输出自己的类,只需要重载<<操作符就可以了,例如下面的例子:
#include "easylogging++.h" _INITIALIZE_EASYLOGGINGPP class MyClass { public: MyClass(const std::string& name_) : name_(name_) {} std::string name(void) const { return name_; } void setName(const std::string& name_) { this->name_ = name_; } friend std::ostream& operator<<(std::ostream& stream_, const MyClass& myClass); private: std::string name_; }; std::ostream& operator<<(std::ostream& stream_, const MyClass& myClass) { stream_ << "MyClass name is " << myClass.name(); return stream_; } int main(void) { MyClass myClass("Awesome class"); LINFO << myClass; return 0; }
main函数中用可以LINFO像其他内置数据类型一样输出了myClass,则会输出log如下:
1 4:32:47.031 INFO MyClass name is Awesome class
如果要输出STL的string,wstring等类和容器:vector,list,map,set等,则只需定义宏:_ELPP_STL_LOGGING
如果要支持QT库的类输出,则需定义宏:_ELPP_QT_LOGGING