C/C++ plog日志简单用法

C++编程规范 有时候并不能解释“为什么”,作为开发者也必须给出两部分信息,状态描述“怎么了”与明确的指导性意见“怎么办”,即使指导性意见不能彻底解决问题。提示信息、警告信息、错误信息实质目的是告知使用者“怎么办”的,也就是指导他人具体如何解决问题的,所以,完整的日志信息应该即要告知“怎么了”,也要说明“为什么”,更要指示“怎么办”。只有单文件的,写在单文件开头。2.2、高技巧语句,通常难懂,可读性差,在可读性和程序效率上进行权衡时,应该更多考虑可读性。5.1、三目运算符,不利于理解,不利于调试,降低代码可读性; 阅读详情
AI摘要

本文介绍了Plog日志库的安装配置与基本使用方法,包括下载安装、环境搭建、日志文件管理及在不同IDE中的应用。通过实例演示如何控制日志文件的大小和数量,并展示了基于时间戳的日志文件命名技巧。

最近突然心血来潮,想学一下日志方面的操作。在网上找了很多日志相关的技术,最终还是决定使用plog,小巧,快速,跨平台.


一、下载plog

下载链接:https://github.com/SergiusTheBest/plog/releases
在这里插入图片描述

下载后解压出来,就得到了我们需要的头文件了
在这里插入图片描述


二、在VS中搭建plog编译环境

在vs中新建项目,根据以下图片步骤将plog头文件包含到项目中去

  1. 将include文件夹拷贝到项目路径
    在这里插入图片描述

  2. 将头文件路径包含进来
    右键项目 - 属性 - VC++目录 - 包含目录
    将项目路径中的include路径包含进来
    在这里插入图片描述

  3. mian函数中加入头文件

    #include <plog/Log.h> 
    #include <plog/Initializers/RollingFileInitializer.h>
    

至此,plog的编译环境已经整好了,可以使用它了。


三、使用plog日志库

  1. 简单用法

    使用init函数进行打开文件和初始化

    plog::init(plog::debug, "日志.txt");
    
    // 参数一使用的枚举:
    /*
    enum Severity
    {
        none = 0,
        fatal = 1,		// 致命错误
        error = 2,		// 错误
        warning = 3,	// 警告
        info = 4,		// 通知
        debug = 5,		// 调试
        verbose = 6
    };
    */
    

    参数一是日志的类型,一般用plog::debug或plog::verbose即可,参数二是日志路径和文件名;当然还有参数三和参数四,将在下面例子讲解。

    初始化之后,就可以使用宏LOGD或PLOG_DEBUG或PLOG(plog::debug),将日志信息写入日志文件中了。

    LOGD << "日志打印";
    LOGD << "日志Debug" << 123 << "test" << 3.1415926;
    

    编译运行,就会发现在项目路径中多出了一个日志.txt的文件,这个就是我们这个项目中的日志文件。
    在这里插入图片描述
    进入就可以看到刚刚在代码中写入的日志信息了 在这里插入图片描述
    日志中有时间信息,还有此日志是什么类型的(图上的是DEBUG类型),此条日志信息是在那个函数中进行写入的(图上显示的是main函数,也是正确的),最后是日志信息!

    当然,也还可以在函数中使用,例如新建一个函数,在函数中写日志信息

    void testLog() {
    	LOGD << "testLog()";
    }
    

    然后接着调用此函数

    plog::init(plog::debug, "日志.txt");
    LOGD << "日志打印";
    LOGD << "日志Debug" << 123 << "test" << 3.1415926;
    testLog();
    LOGD << "函数结束";
    

    编译运行后日志文件
    在这里插入图片描述
    已经将日志信息写入文件中了!

  2. 指定日志文件大小和个数

    // 参数一:日志类型		参数二:日志文件名		参数三:日志文件大小		参数四:支持多少个日志文件
    plog::init(plog::debug, "Hello.txt", 1024, 5);	// 每个文件最大1024,最多5个文件,超过开始覆盖
    

    1024是指单个日志文件只能是1024大小左右;5是指该项目只会有5个日志文件,如果日志数据量大,超过了限制,那么会对前面的日志文件进行覆盖。

    写一个例子,往日志文件中写入七十条日志,看看是什么效果

    int index = 0;
    while (index < 70) {
    	LOGD << "测试日志:" << index++;
    }
    

    编译运行后
    在这里插入图片描述
    生成了5个日志文件Hello.1.txt、Hello.2.txt、Hello.3.txt、Hello.4.txt、Hello.txt

    根据日志打印的数字可以看出,Hello.4.txt是最开始先使用的日志文件,刚开始名字应该是Hello.txt才对的,后来因为他的存储大小超过了1024,所以plog会将他的文件名进行更改为Hello.1.txt,然后继续创建一个Hello.txt的文件进行存储日志信息;当文件大小又超过1024时,会首先将Hello.1.txt名字更改为Hello.2.txt,然后才会将Hello.txt更改为Hello.1.txt;然后继续创建一个Hello.txt的文件进行存储日志信息…
    依此类推,最终得到上图效果!

    当超过五个日志文件大小存储时,会对前面刚开始写入的日志信息进行覆盖
    可以将上面的index判断次数修改为85,编译运行

    int index = 0;
    while (index < 85) {
    	LOGD << "测试日志:" << index++;
    }
    

    在这里插入图片描述
    之前的 Hello.4.txt 文件已经被删除了,然后被之前的Hello.3.txt给替换掉了,前面的一样会往后进行替换,最后就可以腾出新的文件Hello.txt进行继续存储了!

  3. 使用时间作为文件名
    我就比较喜欢这种命名方式了
    也就是将当天的年月日作为日志的文件名,这样运行程序,每天也只会生成一个日志文件,记录当天的日志信息,也方便后期查询!

    #include <string>
    #include <time.h>
    
    
    std::string getCurrentTime(std::string& year, std::string& month, std::string& day, std::string& hour, 	std::string& min, std::string& sec) {
    	// 获取系统时间 - 年月日时分秒
    	time_t _time;
    	struct tm* target_time;
    	time(&_time);
    	target_time = localtime(&_time);
    
    
    	year = std::to_string(target_time->tm_year + 1900);
    	month = target_time->tm_mon + 1 > 9 ? std::to_string(target_time->tm_mon + 1) : "0" + std::to_string(target_time->tm_mon + 1);
    	day = target_time->tm_mday > 9 ? std::to_string(target_time->tm_mday) : "0" + std::to_string(target_time->tm_mday);
    	hour = target_time->tm_hour > 9 ? std::to_string(target_time->tm_hour) : "0" + std::to_string(target_time->tm_hour);
    	min = target_time->tm_min > 9 ? std::to_string(target_time->tm_min) : "0" + std::to_string(target_time->tm_min);
    	sec = target_time->tm_sec > 9 ? std::to_string(target_time->tm_sec) : "0" + std::to_string(target_time->tm_sec);
    
    	return year + month + day + hour + min + sec;
    }
    
    
    int main(void) {
    	std::string year, month, day, hour, min, sec;
    	getCurrentTime(year, month, day, hour, min, sec);
    	std::string logName = year + month + day + ".txt";
    	plog::init(plog::verbose, logName.c_str());
    	LOGD << "时间日志名字";
    	int index = 0;
    	while (index < 85) {
    		LOGD << "测试日志:" << index++;
    	}
    	return 0;
    }	
    

    编译运行
    在这里插入图片描述
    根据当天的日期创建了日志


四、QTCreator使用plog日志库

将plog文件夹拷贝到QT项目中去,注意,这里并没有包含那个include文件夹
在这里插入图片描述

然后右键项目,选择Add Existing Directory…
在这里插入图片描述

勾选上plog,点击确定
在这里插入图片描述

这样plog模块就添加进来了
在这里插入图片描述

然后在QT项目中添加头文件就可以使用了

#include <plog/Log.h>
#include <plog/Initializers/RollingFileInitializer.h>

plog::init(plog::verbose, "test.txt");
LOGD << QString::fromStdString("时间日志名字");
int index = 0;
while (index < 85) {
    LOGD << QString::fromStdString("测试日志:") << index++;
}

在这里插入图片描述
可以使用!


五、总结

plog的简单用法到这就结束了,其实plog还有很多用高效的用法,在文件夹samples中有案例,有兴趣的可以去看看!

plog嵌入式C++日志库:轻量、零开销与跨平台实践 日志系统是嵌入式软件可观测性的基础设施,其核心诉求在于确定性延迟、内存可控与硬件适配能力。基于C++模板元编程实现的静态多态架构,使日志操作在编译期完成类型绑定与路径优化,彻底规避虚函数调用、动态内存分配及锁竞争,达成真正零运行时开销。该技术路径显著提升中断响应效率与资源受限场景下的稳定性,广泛应用于FreeRTOS任务追踪、Arduino串口调试及裸机系统状态记录。结合滚动文件、JSON格式化、SPI Flash自定义Appender等工程扩展能力,plog支撑从开发调试到量产部署的全生命周期日志治理,是 阅读详情

相关推荐

一文详解 C++ 日志框架

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

青春不老,奋斗不止! 8920

C++plog库,轻量级日志框架(日志库)

在使用自动捕获’this’指针技术时,当用户使用日志记录器记录一条消息时,plog库会自动捕获当前对象的指针,并将其添加到日志消息中,以便用户在查看日志时能够识别与对象相关的消息,并更好地理解程序的行为和状态。在使用延迟流评估技术时,当用户使用日志记录器记录一条消息时,不会立即将消息转换为字符串格式,而是将消息的内容保存到一个缓存区中,直到真正需要输出消息时,才将缓存区中的内容格式化为字符串,然后输出到目标位置。这个头文件定义了一个滚动文件输出的日志附加器,可以将日志写入到滚动的日志文件中。

Dontla的博客 7200

【Halo】封装plog为sdk.dll的对外api 方案1 :格式化输出

本文介绍了一种DLL日志API设计方案,实现了EXE和DLL日志的统一管理。方案基于PLOG封装,提供线程安全的日志输出功能,支持C/C++调用。主要特点包括:统一日志文件输出、互斥锁保护、兼容现有代码、提供便捷函数和宏定义两种使用方式。实现步骤涉及在DLL项目中添加日志API文件,在EXE项目中初始化日志系统后即可使用。该方案便于调试DLL与EXE的交互过程,性能良好且易于维护扩展。

突围 253

C++日志库plog使用指南

plog是一个轻量级、跨平台的C++日志库,它设计简洁且易于使用

new9232的博客 6355

php日志系统(plog) 1.0

plog是一款轻量级,易定制,易使用,易扩展的php日志系统。可以很方便地添加日志处理工具、自定义输出格式、自定义日志类型等等。 几点说明: •levels项,每一个值都是一个方法,不过是小写的,如$log→debug(‘message’)。如果某个方法不在这些levels里会触发异常。 •日志格式的可选变量在plog/formatter.php里,每一个get开头的方法就是,如果觉得不够用,可以自己添加。

plog:可移植,简单且可扩展的C ++日志记录库

plog:可移植,简单且可扩展的C ++日志记录库

PLog——一个简洁快速,小而美的C++异步日志库

PLog 简介 plog(pithy log)是一个简洁快速,小而美的C++异步日志库,设计目标(自吹自卖,手动狗头): 简洁快速:不严格的测试中,每条200字节(100的真正内容,100的时间线程等信息)的log,i7x9700@4.3GHz@8核8线程,开200个线程下,固态硬盘,速度70W条/s左右,吞吐量140MB/s左右,勉强达到了高性能的门槛,使用时只需要包含一个文件,配置简单只需两三行代码;总代码量加空行和注释350行左右,真正的核心代码170行左右,不依赖其他代码只依赖C++17(主要用了

C++是世界上最好的语言,手动狗头 8325

QT plog日志库,记录log日志信息

QT plog,记录日志三方库;

【C++】plog

plog 介绍

qq_30340349的博客 1056

Prometheus常用配置介绍

除了 scrape_configs 外,上部还有 global 和 rule_files 部分, 其中 global 中 是 全 局 参 数 , scrape_interval 指 定 全 局 默 认 的 时 间 间 隔 , evaluation_interval 指定告警规则校验的时间间隔,rule_files 指定了告警规 则文件的位置名称。• annotations(注释):它们被用于存储更长的其他信息,例如警报描述 或者链接,注释值也可以被模板化。• alert:告警的名称。

weixin_42886699的博客 2259

详解STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用

本文详细解析了STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用。通过CubeMX配置、代码实现和常见问题解决方案,帮助开发者高效实现多通道数据同步采集,提升工业自动化和嵌入式系统的数据采集效率与精度。

ii567的博客 364

推荐文章:Plog - 简洁高效的C++日志解决方案

在追求高效开发的今天,拥有一个轻量级而又功能强大的日志库对于软件开发至关重要。今天,让我们一同探索名为Plog的开源宝藏——一个便携、简单且可扩展的C++日志库,它以约1000行代码实现了令人印象深刻的性能与灵活性。 ## 项目简介 Plog,顾名思义,为 Portable Log 的缩写,旨在替代那些重量级的日志框架,提供了一个简洁的解决方案,适用于从嵌入式系统到复杂的服务器端应用。它的设计...

gitblog_00845的博客 1273

通达信【雷霆尊者排序】实战指南:高胜率竞价指标解析与优化策略

本文详细解析了通达信【雷霆尊者排序】指标在集合竞价阶段的应用,提供从基础设置到实战解码的完整指南。文章重点剖析了‘雷霆’、‘使者’、‘精选’等核心信号的逻辑与共振策略,并分享了如何结合K线、市场情绪进行综合研判与风险控制,旨在帮助短线交易者提升早盘选股效率与胜率。

pear55的博客 948

C++ 日志库神仙打架!spdlog、glog、log4cxx、plog 谁才是真正的王者

本文对C++四大主流日志库(spdlog、glog、log4cxx、plog)进行了全方位评测分析。通过性能测试、功能对比和实战场景演示,总结出各库的核心优劣势:spdlog以高性能和零依赖特性成为通用首选;glog的崩溃捕获功能在调试场景无可替代;log4cxx的灵活配置适合企业级应用;plog则以极简特性赢得嵌入式开发青睐。文章不仅提供详细的技术参数对比,还分享了日志库选型的实战经验与避坑指南,帮助开发者根据项目特点选择最适合的日志解决方案。 [关键词] C++日志库、spdlog、glog、log4c

C++、Python、Linux、人工智能、车载开发、QT开发、AI绘画。 1545

34、Text2KGBench与GeoQuestions1089:知识图谱生成与地理空间问答的新进展

本文介绍了Text2KGBench和GeoQuestions1089在知识图谱生成与地理空间问答领域的最新进展。Text2KGBench提供了一个开放且可复现的基准,用于从文本生成知识图谱,并结合多个LLM模型和评估工具推动研究。GeoQuestions1089是目前最大的地理空间问答数据集,与GeoQA2系统结合,推动了地理空间问答系统的发展。文章还探讨了技术挑战和未来研究方向,包括多模态知识图谱生成和深度学习优化的地理空间问答系统。

css33的专栏 114

C#实现每日定时执行制定程序(附完整源码)

C#实现每日定时执行制定程序(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 862

终极glog错误码处理指南:PLOG宏与errno集成实践

glog是一款由Google开发的功能强大的日志库,它为C++项目提供了高效、灵活的日志记录功能。在程序开发中,错误处理是至关重要的一环,而glog的PLOG宏与errno集成实践则是提升错误处理能力的关键技巧。 ## 为什么需要PLOG宏? 在C/C++编程中,许多系统调用和库函数在发生错误时会设置全局变量`errno`来指示错误原因。传统的日志记录方式需要手动获取`errno`并将其转换为

gitblog_00008的博客 502

基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 316

C/C++log日志库

C/C++log日志库比较 超轻量级、高性能 C/C++ 日志库 EasyLogger C语言日志库zlog总结

嵌入式技术 1293

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8299

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

m0_46364958的博客 4345

CANN Runtime错误排查完全指南:错误码解读、异步错误定位与plog日志分析

CANN Runtime 是华为 CANN 软件栈中负责 Ascend NPU 运行时核心实现与维测功能的组件。本文面向新手,带你一次搞懂 **CANN Runtime 错误排查**的完整方法论:如何快速解读**错误码**、如何定位延迟暴露的**异步错误**、以及如何通过 **plog 日志分析**锁定 Device 侧异常根源。 ## 🧭 先搞懂:CANN Runtime 的错误从哪里来

gitblog_00791的博客 1046

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

开源PLog库的使用

plog下载地址https://github.com/SergiusTheBest/plog 假设有下面三个模块,欲使他们3个日志都写到同一个log.txt文件。A依赖B、C 模块 ModleA.exe ModleB.dll ModleC.dll 在ModleA中 #include “MoudlB.h” #include “MoudlC.h” #include "Lo...

u010189308的专栏 3196

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[C/C++]简单的C++日志操作类

直接上代码 LogFile.h // // LogFile.h // ftpz // // Created by 胖胖的ALEX on 2017/10/26. // #ifndef FTP_LOGFILE_H #define FTP_LOGFILE_H class LogFile { public: LogFile(); ~LogFile(); typedef enum enLo

胖胖的ALEX 976

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

CANN Runtime 日志接口实战:基于 acl_log.h 的用户模块日志记录与设备日志回调注册指南

本篇文章以 CANN Runtime 开源仓库中的可运行日志样例 [example/5_performance/log](https://link.gitcode.com/i/5aa9792ad16d3ebb96383500e95bbd3d) 及其子样例 [example/5_performance/log/0_acl_log](https://link.gitcode.com/i/4a848b3

gitblog_00186的博客 1016

CANN/asc-devkit CPU日志API

| 产品 | 是否支持 | |------|---------| | Ascend 950PR/Ascend 950DT | √ | | Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ | | Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ | | Atlas 200I/500 A2 推理产品 | √ | | Atlas 推理系列产品 AI Core

gitblog_01044的博客 405
上一篇: VS2017 包含了文件路径却还是找不到头文件(无法打开源文件“***.h”)
下一篇: C/C++ vs2017 OpenCV简单入门
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值