小记录器类

her*_*ian 28 c++ logging

我正在寻找一个c ++的小型轻量级日志系统.我找到了一些现有的框架,但此时我并不需要它们的所有功能.我主要是在寻找一个可以配置日志级输出文​​件的小型系统.我正在寻找现有的解决方案,因为我不想重新发明轮子.

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*.因此,我们现在可以通过链接流来添加很好的功能,例如加密日志.

  • ftp://ftp.drdobbs.com/sourcecode/ddj/2007/0710.zip."log.h"是最好的文件; 另一个是灵活性较低的模板版本.我已经将它上传到这里,以防Dobbs博士再次将其重新播放:http://pastie.org/1574516. (6认同)
  • 我开始使用这个lib并且我输入了bitbucket:https://bitbucket.org/volkanozyilmaz/logcpp (3认同)

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++专家,因此在极端情况下此代码可能会爆炸).

  • +1为最低版本。我必须将第一个配置行`structlog LOGCFG = {};`放在全局作用域的main方法之外,以使其起作用。 (2认同)

Abs*_*Web 8

到目前为止,所有提到的记录器都使用宏来记录调用.对我来说,这太丑了,我不关心它带来的性能提升,我不会接近它.

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)


Ser*_*bry 7

我建议尝试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)