Для тех, кому нужно простое решение, я рекомендую: 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;
}
Пример вывода внутри класса:
2015-08-28 10: 38: 45 900 DEBUG[по умолчанию] [user @ localhost] [Config :: Config (const string)] [src / Config.cpp: 7] Чтение конфигурационного файла: 'config.json'
Я пробовал log4cpp и boost:: log, но они не так просты, как этот.
ДОПОЛНИТЕЛЬНОЕ СОДЕРЖАНИЕ: минимальная версия - заголовок 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 */
Использование:
#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";
}
Этот код печатает сообщение, используя «cout», но вы можете изменить его на «cerr» или добавить файл,и т.д. Я надеюсь, что это полезно для кого-то.(Примечание: я ни в коем случае не эксперт по C ++, поэтому этот код может взорваться в крайних случаях).