小记录器类

时间:2011-02-17 11:25:31

标签: c++ logging

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

9 个答案:

答案 0 :(得分:38)

我强烈推荐这个简单的日志记录系统:http://www.drdobbs.com/cpp/201804215。它由单个头文件组成。我已成功在Linux,Windows和Mac OS X上使用它。

你这样写日志:

FILE_LOG(logWARNING) << "Ops, variable x should be " << expectedX << "; is " << realX;

我非常喜欢流语法。它不引人注目,类型安全且富有表现力。日志记录框架会自动在行尾添加\n,以及日期,时间和缩进。

配置日志非常简单:

FILELog::ReportingLevel() = logDEBUG3;
FILE* log_fd = fopen( "mylogfile.txt", "w" );
Output2FILE::Stream() = log_fd;

这个框架也很容易扩展。在工作中,我们最近对其进行了一些调整,以便现在使用std::ofstream代替FILE*。因此,我们现在可以通过链接流来添加很好的功能,例如加密日志。

答案 1 :(得分:16)

对于想要简单解决方案的人,我建议: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]读取配置文件:   &#39; config.json&#39;

我尝试了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 */

用法:

#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";
}

此代码使用&#34; cout&#34;打印消息,但您可以将其更改为使用&#34; cerr&#34;或附加文件等。我希望它对某人有用。 (注意:我不是任何方式的C ++专家,因此在极端情况下此代码可能会爆炸)。

答案 2 :(得分:8)

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

https://github.com/gabime/spdlog是我喜欢的。清晰的语法,处理所有典型的用法。快而小。例如对于文件记录器,它是:

auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt");
my_logger->info("Some log message");

答案 3 :(得分: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;
}

答案 4 :(得分:2)

如果您对项目没有尺寸限制,并且您希望它能够存活很长时间,我建议您查看Apache Log4cxx。它不是一个小型的库,但它在日志记录中支持您想要的所有内容(包括一些您根本不知道的东西),并且它是可移植的。

在任何大型项目中,您迟早都希望您的日志记录解决方案不仅仅是“小型记录器类”,所以确实需要重新发明轮子。

答案 5 :(得分:1)

This question我尝试了一些幻想。它完全是标准C ++,不做任何平台假设。它基本上由一个像这样使用的临时对象组成:

Debug(5) << "This is level 5 debug info.\n";

我确信你可以弄明白如何在拥有基本布局时指定不同的文件和其他东西。我试图保持类的结构,以便在发布版本中,尽可能地删除每种形式的Debug输出。

请注意:如果您在每次构建文件时指定文件名,并打开文件并再次关闭它,性能将受到影响。在多个输出文件的情况下,最好有几个静态数据成员在程序运行时打开不同的文件或第一次打开它们。

答案 6 :(得分:1)

以上答案都很好。

怀疑任何人都不会看到这个答案,但这是我使用的 https://github.com/asn10038/Cpp_Logger

在.h文件中配置4-5个变量名之后,易于设置,并且实现时没有非标准依赖性。

不仅标头,而且很容易。

也许这可以帮助某人。

答案 7 :(得分:0)

更新Dr. Dobb的“用于C ++的轻量级记录器”: Dob博士实际上提到了几个记录器。第一个Logging In C++列在其中一个答案中。我尝试使用这个,但Dobb博士的网站上已不再提供来源。

第二个对我有用并且我推荐的是由菲利普Janiszewski在诺基亚西门子通信公司工作的A Lightweight Logger for C++。起初我在运行这些代码时遇到了一些问题,因此当我搜索解决方案时,我遇到了原始作者的更新:GitHub: fjanisze/logger。我发现这段代码易于理解,修改和使用。它是线程安全的,适用于Windows的Visual Studio。

上面提到的另一个记录器是easylogging++。当我第一次尝试这个时,看起来很有希望。但是当我在Windows下添加线程和套接字2时,它就崩溃了。我确实有线程和Sock2的定义集,但我仍然无法让它工作,所以我不推荐这个。源代码也非常复杂,所以我没有机会在合理的时间内修改和修复它。

答案 8 :(得分:0)

我以及其他许多人也用一些代码回答了这个问题。

这并不是真的“准备就绪”,但是可以很容易地对其进行修改:

https://gist.github.com/earonesty/977b14c93358fe9b9ee674baac5d42d7

功能:

  • 写入日志不会在i / o上阻止
  • 与其他解决方案(LOGE(blah << stream))类似的宏
  • 宁愿丢弃日志条目也不希望减慢速度
  • 懒惰冲洗
  • 仅标头,非常小,仅stl类
  • 在osx / win / nix上测试
  • 时间格式是可配置的

缺少的东西:

  • 简单,灵活的日志格式(预定义宏就可以了)
  • 触发器具有界面,但尚不可用
  • 微秒尚未运行

如果任何人实际上以任何方式喜欢此解决方案,lmk和我都会通过测试等从中获得真正的回购。这非常快。可能不及speedlogger(功能更强大的完整库)快,但不确定。