精华内容
下载资源
问答
  • C++ 日志框架总结
    千次阅读
    2021-06-04 09:38:59

    这么多年自己还真没怎么写过日志框架,都是用的第三方库,用过Log4Cppspdlogmuduo中的日志部分。

    想自己总结下,又发现了一篇分析极为到位的C++日志框架总结:一文详解C++日志框架,遂放弃自己动手的想法,奉行拿来主义。

    CSDN地址为:https://blog.csdn.net/liang19890820/article/details/109153251
    wexin公众号地址为:https://mp.weixin.qq.com/s/92JNr29Px0TORsJqh3KjmQ

    更多相关内容
  • 跨平台的C++日志

    2018-10-17 10:20:00
    一个跨平台的C++日志库,包含技术点如下: 1. 支持异步线程写日志 2. 跨平台、线程安全 3. 回调机制 4. 单例 5. 模板类
  • 超简单的C++日志

    2017-09-26 11:43:09
    非常适合新手阅读, 代码量极少, 实现了日志最基本的需求, 有等级控制, 文件控制, 性能足够一般小型项目调试使用, 线程安全, 全局单例, 并有定义了几个宏, 可直接用宏, 使用方式类似于 printf, 支持不定参数
  • 自己写的一个小小的日志库,功能比较简单,单一。主要用到__FILE_、__FUNCTION__、__FILE__等宏定义。日志主要记录文件、行数、函数名、日志信息。日志的格式最终保存为json格式,方便查看。
  • C++打印日志
  • 这是一个我自己用C++编写的 log文件记录库,使用方便。
  • C++日志库-线程安全

    2019-04-28 19:02:17
    C++线程安全日志库-Win32接口实现,博客讲解:https://www.cnblogs.com/swarmbees/ ->C++线程安全日志库-Win32接口实现
  • c++日志框架库.zip

    2020-01-17 17:18:52
    封装spdLog框架,便于自己的简单使用。分装的类只有三个接口,支持在mfc程序中显示控制台,并且控制台输出使用颜色进行区分日志等级。
  • 主要介绍了linux系统中c++日志文件功能,简化了glog,只保留了写日志文件的功能,只是改写了linux版本,需要的朋友可以参考下
  • c++日志调试打印.zip

    2019-09-11 16:37:34
    c++日志调试打印
  • C++ 日志框架

    千次阅读 2018-10-10 07:25:49
    何为日志框架日志框架:一个经过专门设计的实用程序,用于规范应用程序的日志记录过程。日志框架可以自己编写(技术要牛才行哦),也可以由第三方(例如:log4...

    何为日志框架

    日志框架:一个经过专门设计的实用程序,用于规范应用程序的日志记录过程。

    日志框架可以自己编写(技术要牛才行哦),也可以由第三方(例如:log4cplus)提供。对于不同的日志框架,各自的组织在实现方式上也有所不同。

    虽然可以简单地“标准化”日志(例如:调用文件系统 API,将信息写入名为 log.txt 的文件),但是要成为一个严格意义上的框架,必须要超越标准化。也就是说,日志框架必须通过处理日志记录来标准化解决方案,从而暴露一个标准的 API。

    没明白?那就再具体一些,设想一个日志框架,封装了三个主要部分:

    当想要捕获程序的运行时信息时,首先要发出要记录的信息。然后,格式化这些信息。最后,决定将它输出到哪里。一般情况下,会输出到文件中,但是也可以将其输出到控制台、数据库,或者任何能够接收数据的地方。

    如果有一系列代码,能够解决这些问题,那么就可以被看作是一个日志框架。

    为什么不是 cout

    使用日志,只为成为更好的攻城狮。

    也许有人会问:既然 C++ 中有 cout,为什么还要使用日志呢?

    无法否认,在使用像 C++、Java、PHP 这样的编程语言时,我们会经常将消息打印到控制台,因为这是开发、测试和调试程序的一部分。但倘若我们正在处理一个服务端程序,却无法看到其内部发生了什么,这时该怎么办?唯一的可见性工具是日志文件,如果没有日志,我们就不能进行任何调试,也无法知道程序内部在做什么。

    尽管 C++ 中有相当方便的 cout 输出流,可以在控制台上打印一些信息,或者可以通过其他方式将这些信息重定向到文件中,但这对于实际的应用程序来说根本不够。尤其对于复杂的 C++ 程序来说,像 log4cplus 或任何其他日志框架能够提供了更多的灵活性,而这是 cout 不可能完成的。

    在编写代码时,使用日志框架是一种很好的实践。即使像《代码整洁之道》这样的书籍,也建议学习像 Log4j 这样的框架进行日志记录。所以,请尽可能的在生产代码中使用日志,而不是用 cout 来打印东西(这是不可接受的)。

    使用日志的好处

    日志是一个优秀系统不可或缺的组成部分。

    对于很多人来说,日志的作用仅限于调试。其实不然,它在很多方面都非常有用:

    • 日志是最好的的诊断工具

    绝大多数人都曾面临这样的困境——一旦程序出现问题,很长时间都找不出原因!

    缺少日志,我们将不得不依赖于客户或支持团队,让他们描述在什么情况下发生了什么(很可能会存在一些误导)。随后我们需要通过开发环境重现问题,并进行各种调试,直至错误修复为止,然而这一般会耗费很长时间。但若有日志的帮助,我们便能迅速摆脱这种困境,可以很快地发现异常,并快速定位、解决问题!

    • 日志让我们有机会检测模块的瓶颈

    随着项目规模的增加,模块会越来越多,调优也变成了一场持久战。

    通过记录某些操作的日期和时间,我们可以及时地检测模块的瓶颈,并针对性地对一些耗时操作做出优化。

    • 日志有助于我们了解用户行为

    为了提高产品质量,提供个性化服务,就必须了解用户行为——他们做了什么,想要什么。

    要搞清楚这些,当然要有数据,所以需要采集和分析用户的行为,而日志无疑是最主要的数据来源。

    要不要重新发明轮子

    不要去重新发明轮子——《麦肯锡方法》

    既然已经对日志框架有了明确的了解,那么应该使用现有的日志框架,还是构建自己的日志框架呢?其实,这是一个老生常谈的问题了——要不要重新发明轮子?引用莎士比亚戏剧《哈姆雷特》中的一句名言:

    To be or not to be - that is the question.

    现在我们正处于技术大爆发的时代,每一个技术领域中都有很多好的解决方案。因此,自己完全不需要、也不应该去写日志框架。就像不应该写版本控制工具或 Bug 跟踪管理工具一样,其他人已经把这些东西搞出来了,而且搞的很好,Git、SVN,Bugzilla、Trac……应有尽有,我们完全可以花很少的钱,甚至是免费使用它们。

    所以,请避免重复劳动,不要去重新发明轮子。应该坚持在自己的领域解决问题,将时间花在刀刃上。话虽如此,但我们还是需要了解关于轮子的一些细节(谁造的?怎么创造的?如何使用?),以从中接受灵感,并把自己的知识加进去。

    因此,当需要一个日志框架时,应该使用现有的框架,而不是去重新发明轮子。那么,问题来了,日志框架都有哪些呢?

    日志框架都有哪些

    C++ 中的日志框架有很多,其中比较著名的有:

    • log4cxx:Java 社区著名的 Log4j 的 C++ 移植版,用于为 C++ 程序提供日志功能,以便开发者对目标程序进行调试和审计。

    • log4cplus:一个简单易用的 C++ 日志记录 API,它提供了对日志管理和配置的线程安全、灵活和任意粒度控制(也基于 Log4j)。

    • Log4cpp:一个 C++ 类库,可以灵活地记录到文件、syslog、IDSA 和其他目的地(也基于 Log4j)。

    • google-glog:一个 C++ 语言的应用级日志记录框架,提供了 C++ 风格的流操作和各种辅助宏。

    • Pantheios:一个类型安全、高效、泛型和可扩展性的 C++ 日志 API 库(号称 C++ 领域速度最快的日志库)。

    • POCO:还提供了一个 好的日志支持文档。

    • ACE:ACE 也有日志支持。

    • Boost.Log:设计的非常模块化,并且可扩展。

    • Easylogging++:轻量级高性能 C++ 日志库(只有一个头文件)。

    • G3log:一个开源、支持跨平台的异步 C++ 日志框架,支持自定义日志格式。基于 g2log 构建,提升了性能,支持自定义格式。

    • Plog:可移植、简单和可扩展的 C++ 日志库。

    • spdlog:一个快速的 C++ 日志库,只包含头文件,兼容 C++11。

    • ……

    这么多框架,应该选择哪一个呢?

    由于每个人的需求和技术栈都不一样,所以很难直接回答这个问题,但是有一些选择标准可供参考。

    日志选择标准

    • 易用性

    易于使用的框架,能让你事半功倍。

    易用性,是优秀框架的一个重要特性。所以无论使用什么框架,都应优先考虑这一点。

    对于日志框架而言,一旦被选定,在后期开发过程中,项目组中的每个人都会频繁使用。如果易用性不好的话,那绝对是一个噩梦!所以,在选择日志框架时,应尽量找那些由简单、直观的 API 实现的方案。一个简单日志框架,衡量标准可参考:对于缺乏经验的团队成员,应该在查看文档和简单示例之后,就能够快速上手。

    • 性能(效率)

    功能决定现在,性能决定未来。

    另一个要考虑的重要因素是性能影响。正如上面提到的,我们会经常调用日志,这可能会对程序的性能产生巨大的影响。

    想象一下,一个日志框架,需要花费很长的时间才能启动,在每次调用时阻塞并执行文件 I/O,缺少缓冲机制……对于这样的框架,你会用吗?

    因此,在评估日志框架时,可以参考网上的一些文章来比较,也可以自己做一些比较性实验(基准测试),例如:吞吐量——测量每秒可以完成多少次方法调用(越高越好);采样——测量每次调用执行究竟花费了多少时间(越低越好)。

    • 对现有代码的影响

    影响越小,越容易维护。

    在以后的使用中,日志将无处不在。就像会影响运行时性能一样,它们也会影响源码的可维护性。

    从应用程序的角度来看,日志所处的位置比较尴尬。之所以这么说,是因为我们尽力隔离依赖性,提供良好的接口,并最小化耦合,在编程时考虑的是单一职责原则。然后日志出现了,它到处都是,与周围的代码无关。与这些优秀的设计原则相比,日志显得有些背道而驰。

    • 社区支持

    每一个成功框架的背后,都有一个伟大的社区。

    框架的生命力源于不断地完善和发展,如果没有强大的社区做支撑,这个框架便失去了源动力。

    因此,在选择框架时,这一点非常重要——所选的框架是否有专门的团队做支撑?在像 Stack Overflow 这样的问答网站上,它是否有很强的存在感?确保一点,如果在使用过程中遇到了问题,你能有办法快速解决。倘若选择了一个不知名的框架,当遇到了 Bug 时,那么可能会浪费大量的时间来解决问题。

    • 完整性

    完整的框架,铸就完美的生产力。

    在最前面,我们将日志的功能分为三个主要部分:日志记录、格式化和输出地,所以要确保所选的日志框架彻底解决了这些问题。

    日志记录和输出地比较基础,几乎所有日志框架都有这些概念。话虽如此,但对于好的框架来说,应该巧妙地将日志记录与输出地分开,并且还应该有多种可选的输出地。在理想情况下,最好能够自定义输出地。

    一般情况下,格式化日志文件会整齐地排列,并具有很好的可读性。但在 DevOps 的世界里,这些远远不够。具体来说,日志文件需要被格式化为可解析的数据。通过将日志输出作为数据处理,可以很容易地聚合、搜索和可视化日志,从而能够在生产支持方面助你一臂之力。所以,要确保日志框架拥有这种能力。

    • 发展前景

    只有前途光明,方能大行其道。

    无法绕过这一点——在选择日志框架时,不仅要考虑它的现状,还应该注重它的发展前景。

    像上面提到的 C++ 日志框架,每一个都非常优秀且特点鲜明。但有一些却获得了更多的关注度,例如 log4cplus、glog,为什么如此呢?因为它们有很强大的“基因”和“后台”,一个是著名的 Log4j 的衍生品,另一个则是 Google 的“亲儿子”。

    一个框架的发展前景,取决于众多因素——关注度、用户基数、社区活跃度……要想大行其道,这些几乎都不能少。

    展开全文
  • c++日志产生类

    2013-05-16 22:22:18
    一个很老的c++日志生产类,使用说明: 1.将SAStatusLog.cpp和SAStatusLog.h文件拷贝到自己的工程中 2.包含头文件,定义一个CSAStatusLog的全局变量,像TheApp一样,定义方法参照TheApp。这个日志类中包含了线程同步...
  • C++日志函数封装

    2022-04-03 17:41:52
    //头文件 #ifndef LOGINFO_H #define LOGINFO_H #define _DEBUG #ifdef _DEBUG #define _DBG_PRINT(_FORMAT_, ...) _print_info(__FILE__, __LINE__, _FORMAT_, ##__VA_ARGS__) #else #define _DBG_PRINT(...) ...

    //头文件

    #ifndef LOGINFO_H
    #define LOGINFO_H

    #define _DEBUG

    #ifdef _DEBUG
    #define _DBG_PRINT(_FORMAT_, ...) _print_info(__FILE__, __LINE__, _FORMAT_, ##__VA_ARGS__)
    #else
    #define _DBG_PRINT(...)
    #endif

    void _print_info(const char *src_file, const int code_line, const char *format, ...);

    #define _LOGINFO(_LEVEL_, _APPNAME_, _FORMAT_, ...) _write_log(_LEVEL_, _APPNAME_, __FILE__, __LINE__, _FORMAT_, ##__VA_ARGS__)

    void _write_log(const int level, const char *app_name, const char *src_file, const int code_line, const char *format, ...);

    #endif // LOGINFO_H

    //cpp文件

    #include "loginfo.h"

    #include <stdarg.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <sys/time.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <dirent.h>

    void _print_info(const char *src_file, const int code_line, const char *format, ...)
    {
        char str_format[512] = {0};
        va_list ap;
        va_start(ap, format);
        vsprintf(str_format, format, ap);
        va_end(ap);

        time_t t = time(NULL);
        char cur_time[32] = {0};
        strftime(cur_time, 32, "%Y-%m-%d %H-%M-%S", localtime(&t));

        //获取文件全路径
        char chPath[PATH_MAX] = {0};
        realpath(src_file, chPath);

        printf("%s__%s__%d: %s\n", cur_time, chPath, code_line, str_format);
        fflush(stdout);
    }

    void _write_log(const int level, const char *app_name, const char *src_file, const int code_line, const char *format, ...)
    {
        //当前日志级别>8时,全部输出; <=8时输出指定级别日志;  0级别日志总是输出
        if(0!=level)
        {
            //获取日志级别
            int nCurLevel = 0;

            FILE *pFLogLevel = fopen("LogLevel.ini", "r");

            if(NULL!=pFLogLevel)
            {
                if(!feof(pFLogLevel))
                {
                    char curLine[64]={0};
                    fgets(curLine, 64, pFLogLevel);
                    sscanf(curLine, "level=%d", &nCurLevel);
                }
            }

            if(nCurLevel<=8)
            {
                if(nCurLevel!=level)
                {
                    return;
                }
            }
        }

        //当前时间
        time_t t = time(NULL);

        //创建日志文件路径
        char cur_time[32] = {0};
        strftime(cur_time, 32, "%H-%M-%S", localtime(&t));

        if(NULL==opendir("./Logs"))
        {
            if(-1==mkdir("./Logs", 0777))
            {
                printf("%s__%s__%d: create log dir failure\n", cur_time, src_file, code_line);
                fflush(stdout);
                return;
            }
        }

        //获取文件全路径
        char chPath[PATH_MAX] = {0};
        realpath(src_file, chPath);

        //获取日志文件名称
        char appName[32] = {0};

        if(NULL==app_name)
        {
            strcpy(appName, "log_file");
        }
        else
        {
            strncpy(appName, app_name, 32<strlen(app_name)?32:strlen(app_name));
        }

        char cur_date[32] = {0};
        strftime(cur_date, 32, "_%Y-%m-%d.log", localtime(&t));

        char log_file[256] = {0};
        strcat(log_file, "./Logs/");
        strcat(log_file, appName);
        strcat(log_file, cur_date);

        //写入日志信息
        FILE *pFLogFile = fopen(log_file, "a+");

        if(pFLogFile)
        {
            char str_format[1024] = {0};
            va_list ap;
            va_start(ap, format);
            vsprintf(str_format, format, ap);
            va_end(ap);

            fprintf(pFLogFile, "%s__%s__%d: %s\n", cur_time, chPath, code_line, str_format);

            fclose(pFLogFile);
        }
        else
        {
            printf("%s__%s__%d: open log_file failure!\n", cur_time, src_file, code_line);
            fflush(stdout);
        }
    }
     

    展开全文
  • C++ 生成日志文件

    2018-08-01 17:28:59
    C++日志实现的类。详细使用可以看https://blog.csdn.net/xinshuwei/article/details/81334657或者私聊我
  • 可以同时查看多个日志文件,日志格式代码中有日志文件例子,可以参考。采用 VC++ 多文档类型。便于查看多个日志文件、分析、对比。
  • c++实现日志系统

    2017-01-24 16:27:34
    软件开发中常常将关键的操作、一般性警告以及严重的错误,通过日志文件的形式输出字符串,本子系统实现bootlog,debuglog,warning,fatallog等输出形式,支持linux、windows两种编译环境,支持多线程。有不到之处...
  • 0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, EasyLogger 的功能更加简单,提供给用户的接口更少,但...

    介绍

    本次介绍的项目为EasyLogger,是github上的一个开源项目。
    文墨下载资料

    EasyLogger 是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, EasyLogger 的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件形式进行动态扩展。

    主要功能

    • 支持用户自定义输出方式(例如:终端、文件、数据库、串口、485、Flash…);
    • 日志内容可包含级别、时间戳、线程信息、进程信息等;
    • 日志输出被设计为线程安全的方式,并支持 异步输出 及 缓冲输出 模式;
    • 支持多种操作系统(RT-Thread、UCOS、Linux、Windows…),也支持裸机平台;
    • 日志支持 RAW格式 ,支持 hexdump ;
    • 支持按 标签 、 级别 、 关键词 进行动态过滤;
    • 各级别日志支持不同颜色显示;
    • 扩展性强,支持以插件形式扩展新功能。

    使用说明

    参数配置说明

    EasyLogger 拥有过滤方式、输出格式、输出开关这些属性:

    • 过滤方式支持按照标签、级别、关键词进行过滤;
    • 可以动态的开启/关闭日志的输出;
    • 可设定动态和静态的输出级别

    静态:一级开关,通过宏定义,在编译阶段使用;
    动态:二级开关,通过API接口,在运行阶段使用。

    日志输出级别说明

    日志级别参考Android Logcat ,级别最高为 0(Assert) ,最低为 5(Verbose) 。

    0.[A]:断言(Assert)
    1.[E]:错误(Error)
    2.[W]:警告(Warn)
    3.[I]:信息(Info)
    4.[D]:调试(Debug)
    5.[V]:详细(Verbose)

    输出缤纷多彩的日志

    各个级别日志默认颜色效果如下。
    用户也可以根据自己的喜好,在 elog_cfg.h 对各个级别日志的颜色及字体风格进行单独设置。

    输出过滤

    支持按照 级别、标签及关键词 进行过滤。日志内容较多时,使用过滤功能可以更快定位日志,保证日志的可读性。更多的过滤功能设置方法及细节请阅读\docs\zh\api\kernel.md文档

    输出格式

    输出格式支持:级别、时间、标签、进程信息、线程信息、文件路径、行号、方法名。每种优先级别可以独立设置输出格式。

    输出方式

    通过用户的移植,可以支持任何一种输出方式。只不过对于某种输出方式可能引入的新功能,需要通过插件实现,例如:文件转存,检索Flash日志等等。后期会有更多的插件开源出来。下面简单对比下部分输出方式使用场景:

    • 终端:方便用户动态查看,不具有存储功能;
    • 文件与Flash:都具有存储功能,用户可以查看历史日志。但是文件方式需要文件系统的支持,而Flash方式更加适合应用在无文件系统的小型嵌入式设备中。

    资料下载

    关注v-x-公-众-号:【嵌入式基地
    后-台-回-复:【电赛】 即可获资料
    回复【编程】即可获取
    包括有:C、C++、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料

    在这里插入图片描述

    展开全文
  • C++日志类实现

    2017-09-29 18:54:52
    C++日志类,像使用java日志类的方式使用,可以将所有要打印的类型通过+号相连
  • c++输出日志的 方法

    2018-11-05 13:30:15
    c++输出日志的 方法,c++输出日志的 方法,c++输出日志的 方法
  • 一个VC++的日志生成类 附完整源码例子,编译生成EXE后,在Debug目录下生成txt格式的日志文件,记录程序运行的每一个环节,可扩展成操作日志、维护日志等,源码编译运行截图如图所示。 运行环境:Windows/Visual C/...
  • C++实现日志系统

    2018-07-05 11:06:24
    C++实现的日志系统,支持变长参数,支持文件大小控制。
  • 跨平台c++日志类log

    2016-08-19 09:38:05
    跨平台c++日志类log,很多产品级项目都要求在运行时记录日志,方便维护查询。本类是一个很好用的类,支持跨平台。
  • C++日志打印总结

    2020-12-15 10:00:48
    1.基础打印 头文件: #include <..."日志信息"<<std::endl; 2.头文件:stdio.h post_size:为数据打印信息 printf("====line:%d,post len:%d\n", __LINE__, post_size); 3.log 4.output ...
  • 主要介绍了C++日志记录类实例,代码功能非常实用,需要的朋友可以参考下
  • C++日志类libglog使用

    热门讨论 2015-11-04 21:58:16
    附件是VS2010的工程,C++日志类,谷歌的东西,很好用,也很强大哦! glog简介 Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO) ; “LOG”宏为日志输出关键字...
  • 一个vc日志类源码
  • 一文详解 C++ 日志框架

    千次阅读 2020-10-18 23:28:58
    1日志框架日志框架一个经过专门设计的实用程序,用于规范应用程序的日志记录过程。日志框架可以自己编写(需要一定的能力哦),也可以由第三方(例如:log4cplus)提供。对于不同的日志框...
  • 一个.h文件,封装了日志类,c++跨平台,在很多项目中使用过,使用超级简单。
  • c++日志管理

    2018-01-17 14:44:46
    日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统日志管理系统
  • QT实现单例日志记录类,采用宏调用形式打印日志,支持日志文件夹最大日志文件个数,支持设置日志记录大小,当文件夹日志数到达最大时主动删除最老日志文件--使用方式,直接包含类文件夹,代码中LOG("UI初始化完成1")...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,790
精华内容 58,716
关键字:

c++ 日志

c++ 订阅
友情链接: 61413253.rar