Ped*_*ino 39
我强烈推荐这个简单的日志记录系统:http://www.drdobbs.com/cpp/201804215.它由单个头文件组成.我已成功在Linux,Windows和Mac OS X上使用它.
你这样写日志:
FILE_LOG(logWARNING) << "Ops, variable x should be " << expectedX << "; is " << realX;
Run Code Online (Sandbox Code Playgroud)
我非常喜欢流语法.它不引人注目,类型安全且富有表现力.日志记录框架会自动\n在行尾添加一个,加上日期,时间和缩进.
配置日志非常简单:
FILELog::ReportingLevel() = logDEBUG3;
FILE* log_fd = fopen( "mylogfile.txt", "w" );
Output2FILE::Stream() = log_fd;
Run Code Online (Sandbox Code Playgroud)
这个框架也很容易扩展.在工作中,我们最近对它进行了一些调整,以便它现在使用std::ofstream而不是a FILE*.因此,我们现在可以通过链接流来添加很好的功能,例如加密日志.
lep*_*epe 17
对于任何想要简单解决方案的人,我建议:easylogging ++
单头只有C++日志库.它重量极轻,坚固耐用,性能快,螺纹和类型安全,并具有许多内置功能.它提供了以您自己的自定义格式编写日志的功能.它还为记录您的类,第三方库,STL和第三方容器等提供支持.
该库具有内置的所有内容以防止使用外部库.
简单示例:(上面链接中提供了更多高级示例).
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
int main(int argv, char* argc[]) {
LOG(INFO) << "My first info log using default logger";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
类中的示例输出:
2015-08-28 10:38:45,900 DEBUG [default] [user @ localhost] [Config :: Config(const string)] [src/Config.cpp:7]读取配置文件:'config.json'
我尝试了log4cpp和boost :: log,但它们并不像这个那么简单.
我为基于easylogging的更简单的应用程序创建了一个小代码,但不需要初始化(请注意它可能不是线程安全的).这是代码:
/*
* File: Log.h
* Author: Alberto Lepe <dev@alepe.com>
*
* Created on December 1, 2015, 6:00 PM
*/
#ifndef LOG_H
#define LOG_H
#include <iostream>
using namespace std;
enum typelog {
DEBUG,
INFO,
WARN,
ERROR
};
struct structlog {
bool headers = false;
typelog level = WARN;
};
extern structlog LOGCFG;
class LOG {
public:
LOG() {}
LOG(typelog type) {
msglevel = type;
if(LOGCFG.headers) {
operator << ("["+getLabel(type)+"]");
}
}
~LOG() {
if(opened) {
cout << endl;
}
opened = false;
}
template<class T>
LOG &operator<<(const T &msg) {
if(msglevel >= LOGCFG.level) {
cout << msg;
opened = true;
}
return *this;
}
private:
bool opened = false;
typelog msglevel = DEBUG;
inline string getLabel(typelog type) {
string label;
switch(type) {
case DEBUG: label = "DEBUG"; break;
case INFO: label = "INFO "; break;
case WARN: label = "WARN "; break;
case ERROR: label = "ERROR"; break;
}
return label;
}
};
#endif /* LOG_H */
Run Code Online (Sandbox Code Playgroud)
用法:
#include "Log.h"
int main(int argc, char** argv) {
//Config: -----(optional)----
structlog LOGCFG = {};
LOGCFG.headers = false;
LOGCFG.level = DEBUG;
//---------------------------
LOG(INFO) << "Main executed with " << (argc - 1) << " arguments";
}
Run Code Online (Sandbox Code Playgroud)
此代码使用"cout"打印消息,但您可以将其更改为使用"cerr"或附加文件等.我希望它对某人有用.(注意:我不是任何方式的C++专家,因此在极端情况下此代码可能会爆炸).
到目前为止,所有提到的记录器都使用宏来记录调用.对我来说,这太丑了,我不关心它带来的性能提升,我不会接近它.
https://github.com/gabime/spdlog是我喜欢的.清晰的语法,处理所有典型的用法.快而小.例如,对于文件记录器,它是:
auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt");
my_logger->info("Some log message");
Run Code Online (Sandbox Code Playgroud)
我建议尝试plog库(我是作者).这是大约1000行代码,只有标题,易于使用:
#include <plog/Log.h>
int main()
{
plog::init(plog::debug, "Sample.log");
LOGD << "Hello log!";
LOGD_IF(true) << "conditional logging";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62962 次 |
| 最近记录: |