当前位置: 首页 > news >正文

【C++】开源:跨平台轻量日志库easyloggingpp

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍跨平台轻量日志库easyloggingpp。
无专精则不能成,无涉猎则不能通。。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 安装运行
    • :satisfied:3. 源码分析

😏1. 项目介绍

项目Github地址:https://github.com/abumq/easyloggingpp

Easylogging++ 是一个轻量级、高性能的 C++ 日志库,旨在提供简单易用的日志记录功能。以下是 Easylogging++ 的一些特点和功能:

1.简单易用:Easylogging++ 提供了简洁的 API,使得添加日志记录功能变得非常容易。只需包含头文件并使用简单的宏即可进行日志记录,无需复杂的配置和初始化过程。

2.高性能:Easylogging++ 被设计为高性能的日志库,对于频繁的日志记录操作也有很好的性能表现。它采用了异步日志记录机制,将日志写入缓冲区,并在适当的时机进行批量写入,以提高性能。

3.灵活的日志配置:Easylogging++ 具有灵活的日志配置选项,可以根据需求进行自定义。你可以定义不同的日志级别,选择日志记录的目标(文件、终端等),设置日志格式等。可以通过配置文件或代码进行配置。

4.多线程支持:Easylogging++ 对多线程环境有良好的支持。它使用线程安全的方式处理日志记录,确保在多线程环境下的正确性和一致性。

5.跨平台:Easylogging++ 可以在多个平台上运行,包括 Windows、Linux、Mac等。它不依赖于任何特定的操作系统功能,具有很好的可移植性。

6.支持附加数据:除了记录文本日志消息外,Easylogging++ 还允许你附加其他数据,如时间戳、线程ID等,以便更详细地追踪和分析日志。

7.丰富的功能:Easylogging++ 提供了许多额外的功能,如日志滚动(按时间或文件大小自动分割日志文件)、日志过滤、标签支持等,以满足不同场景下的需求。

😊2. 安装运行

easyloggingpp日志库只需要在项目中包含头文件easylogging++.h和实现easylogging++.cc,即可实现丰富的日志打印功能。

最简日志打印示例:

#include "easylogging++.h"INITIALIZE_EASYLOGGINGPP    // 初始化宏,有且只能使用一次int main(int argc, char* argv[]) {LOG(INFO) << "My first info log using default logger";return 0;
}

我们知道,简单的日志打印有Fatal Error Warn Info Debug5种等级,easylogging支持对日志等级和格式进行配置化,通常可通过配置文件进行管理,一个配置示例如下:

* GLOBAL:FORMAT               =  "%datetime %msg"FILENAME             =  "/tmp/logs/my.log"ENABLED              =  trueTO_FILE              =  trueTO_STANDARD_OUTPUT   =  trueSUBSECOND_PRECISION  =  6PERFORMANCE_TRACKING =  trueMAX_LOG_FILE_SIZE    =  2097152 ## 2MB - Comment starts with two hashes (##)LOG_FLUSH_THRESHOLD  =  100 ## Flush after every 100 logs
* DEBUG:FORMAT               = "%datetime{%d/%M} %func %msg"

另外,除了正常的日志输出外,还提供了条件写日志,每执行n次写日志,写n次日志等功能。但一般最常用的就是LOG(LEVEL)输出对应等级的日志。

示例如下:

# 简单打印
LOG(INFO) << "Here is very simple example.";  
# 条件日志
LOG_IF(1 == 1, INFO) << "1 is equal to 1";  
# 偶然日志(配合for循环)
# 每n次记录一次
LOG_EVERY_N(20, INFO) << "LOG_EVERY_N i = ";
# 当计数达到n次之后,才开始记录日志 
LOG_AFTER_N(6, INFO) << "LOG_AFTER_N i = ";
# 当记录次数达到n次之后,就不再记录 
LOG_N_TIMES(1, INFO) << "LOG_N_TIMES i = ";

该项目也在sample目录内提供了多平台、多环境的应用示例,可参考。

😆3. 源码分析

源码也就是.h和.cc两个文件,一个单头文件的库。

easylogging++.h

// 首先是很多平台、编译器的预判断,可以理解为一些开关
// 然后引用相关头文件
// 预先声明namespace和class
// Forward declarations
namespace el {
class Logger;
class LogMessage;
class PerformanceTrackingData;
class Loggers;
class Helpers;
template <typename T> class Callback;
class LogDispatchCallback;
class PerformanceTrackingCallback;
class LoggerRegistrationCallback;
class LogDispatchData;
namespace base {
class Storage;
class RegisteredLoggers;
class PerformanceTracker;
class MessageBuilder;
class Writer;
class PErrorWriter;
class LogDispatcher;
class DefaultLogBuilder;
class DefaultLogDispatchCallback;
#if ELPP_ASYNC_LOGGING
class AsyncLogDispatchCallback;
class AsyncDispatchWorker;
#endif // ELPP_ASYNC_LOGGING
class DefaultPerformanceTrackingCallback;
}  // namespace base
}  // namespace el

easylogging++.cc

// 默认的日志保存路径
//---------------- DEFAULT LOG FILE -----------------------
#if defined(ELPP_NO_DEFAULT_LOG_FILE)
#  if ELPP_OS_UNIX
static const char* kDefaultLogFile                         =      "/dev/null";
#  elif ELPP_OS_WINDOWS
static const char* kDefaultLogFile                         =      "nul";
#  endif  // ELPP_OS_UNIX
#elif defined(ELPP_DEFAULT_LOG_FILE)
static const char* kDefaultLogFile                         =      ELPP_DEFAULT_LOG_FILE;
#else
static const char* kDefaultLogFile                         =      "myeasylog.log";
#endif // defined(ELPP_NO_DEFAULT_LOG_FILE)#if !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG)
static const char* kDefaultLogFileParam                    =      "--default-log-file";
#endif  // !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG)
#if defined(ELPP_LOGGING_FLAGS_FROM_ARG)
static const char* kLoggingFlagsParam                      =      "--logging-flags";
#endif  // defined(ELPP_LOGGING_FLAGS_FROM_ARG)
static const char* kValidLoggerIdSymbols                   ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._";
static const char* kConfigurationComment                   =      "##";
static const char* kConfigurationLevel                     =      "*";
static const char* kConfigurationLoggerId                  =      "--";
}

在这里插入图片描述

以上。

相关文章:

【C++】开源:跨平台轻量日志库easyloggingpp

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…...

spring-websocket在SpringBoot(包含SpringSecurity)项目中的导入

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f96d;本文内容&#xff1a;spring-websocket在SpringBoot(包含SpringSecurity…...

SpringBoot + Vue前后端分离项目实战 || 六:Jwt加密整合配置

文章目录 回顾添加依赖Jwt依赖Jwt配置定义Jwt拦截器注册Jwt拦截器&#xff0c;配置需要验证token的URL 测试Jwt修改登录等逻辑 回顾 在之前的系统中&#xff0c;我们利用UUID配合Redis以达到角色登录的功能。 当前整个系统存在一个问题&#xff1a;人为修改token值后&#xf…...

WPF 如何设置全局的订阅发布事件

文章目录 前言代码逻辑修改 总结 前言 我们需要一个全局事件订阅发布功能&#xff0c;实现页面通讯。使两个毫无关系的页面通过一个中间量进行通讯。 代码 IEventAggregator&#xff1a;消息订阅集合 这个是Prism提供的消息订阅功能。使用如下 设置订阅类型&#xff0c;即…...

STM32 USB使用记录:HID类设备(前篇)

文章目录 目的基础说明HID类演示代码分析总结 目的 USB是目前最流行的接口&#xff0c;现在很多个人用的电子设备也都是USB设备。目前大多数单片机都有USB接口&#xff0c;使用USB接口作为HID类设备来使用是非常常用的&#xff0c;比如USB鼠标、键盘都是这一类。这篇文章将简单…...

探索AI图像安全,助力可信AI发展

探索AI图像安全&#xff0c;助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…...

vue 学习笔记 【ElementPlus】el-menu 折叠后图标不见了

项目当前版本 {"dependencies": {"element-plus/icons-vue": "^2.1.0","types/js-cookie": "^3.0.3","types/nprogress": "^0.2.0","axios": "^1.4.0","core-js": &quo…...

【JavaEE初阶】HTTP协议

文章目录 1. HTTP概述和fiddler的使用1.1 HTTP是什么1.2 抓包工具fiddler的使用1.2.1 注意事项1.2.2 fiddler的使用 2. HTTP协议格式2.1 HTTP请求格式2.1.1 基本格式2.1.2 认识URL2.1.3 方法 2.2 请求报头关键字段2.3 HTTP响应格式2.3.1 基本格式2.3.2状态码 1. HTTP概述和fidd…...

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…...

effective c++ 条款2

条款2 常量(const)替换宏(#define)指针常量类成员常量 枚举(enum)替换宏(#define)模板函数(template inline)替换宏函数 尽量用const,enum,inline替换#define 总结就是&#xff1a; 常量(const)替换宏(#define) // uppercase names are usually for macros #define ASPECT_R…...

Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】

目录&#xff1a; 1.实战讲解&#xff08;XXTop250完整信息的爬取&#xff09;&#xff1a;1.1 使用之前做的完整的XXTOP250项目&#xff0c;但是设置为只爬取一页&#xff08;共25个电影&#xff09;,便于观察1.2 配置settings文件中使用scrapy_redis的必要配置&#xff0c;并…...

html基于onmouse事件让元素变颜色

最近&#xff0c;在书写div块时&#xff0c;遇到一个小问题&#xff0c;这个小问题我搞了将近一个小时多才慢慢解决。问题是这样子的&#xff0c;有一个div块&#xff0c;我想让鼠标移上去变成蓝色&#xff0c;移开变成灰色&#xff0c;当鼠标按下去时让他变成深蓝色。于是就单…...

Linux环境PostgreSQL安装

今日一语&#xff1a;鲲鹏扶摇而直上九万里&#xff0c;雄鹰展翅高飞&#xff0c;这是因为鲲鹏一出世就得历劫&#xff0c;老鹰刚长出翅膀就会被扔下悬崖 下载安装包&#xff0c;解压到服务器中&#xff0c;然后 make && make install # 登录使用 ./psql # 切换数据库…...

Rust 数据类型 之 结构体(Struct)

目录 结构体&#xff08;Struct&#xff09; 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体&#xff08;Unit Struct&#xff09; 元组结构体&#xff08;Tuple Struct&#xff09; 具名结构体&#xff08;Named Struct&#xff09; 结构体嵌套 结构体方法…...

数据结构之Queue的实现

Queue支持的方法 方法名参数功能返回Sizevoid返回链表规模(该方法由List< T>派生而来)emptyvoid返回链表是否为空(该方法由List< T>派生而来)frontvoid返回队首数据域的引用enqueueT const & e入队voiddequeuevoid出队出队的对象 code // Queue.h # pragma …...

rust声明式宏

宏 在 rust 中&#xff0c;我们一开始就在使用宏&#xff0c;例如 println!, vec!, assert_eq! 等。看起来宏和函数在使用时只是多了一个 !。实际上这些宏都是声明式宏&#xff08;也叫示例宏或macro_rules!&#xff09;&#xff0c;rust 还支持过程宏&#xff0c;过程宏为我们…...

第二章:Learning Deep Features for Discriminative Localization ——学习用于判别定位的深度特征

0.摘要 在这项工作中&#xff0c;我们重新审视了在[13]中提出的全局平均池化层&#xff0c;并阐明了它如何明确地使卷积神经网络&#xff08;CNN&#xff09;具有出色的定位能力&#xff0c;尽管它是在图像级别标签上进行训练的。虽然这个技术之前被提出作为一种训练规范化的手…...

【CSS】box-shadow 属性

box-shadow 是 CSS 属性&#xff0c;用于为元素添加一个阴影效果&#xff0c;使元素看起来浮起或有层次感。 该属性允许设置一个或多个阴影效果&#xff0c;其语法如下&#xff1a; box-shadow: h-shadow v-shadow blur spread color inset;h-shadow&#xff1a;水平阴影的位…...

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…...

Mysql错误日志、通用查询日志、二进制日志和慢日志的介绍和查看

一.日志 1.日志和备份的必要性 日志刷新 2.mysql的日志类型 &#xff08;1&#xff09;错误日志 查看当前错误日志和是否记录警告设置 &#xff08;2&#xff09;通用查询日志 查看通用查询日志的设置 &#xff08;3&#xff09;二进制日志 查看二进制文件的设置&…...

基于Python的网上商城的设计与实现

目录 可选框架 可选语言 内容 可选框架 J2EE、MVC、vue3、spring、springmvc、mybatis、SSH、SpringBoot、SSM、django 可选语言 java、web、PHP、asp.net、javaweb、C#、python、 HTML5、jsp、ajax、vue3 内容 随着信息化时代的到来&#xff0c;电子商务变得家喻户晓&…...

3个关键技巧彻底解决Photoshop WebP格式兼容性问题

3个关键技巧彻底解决Photoshop WebP格式兼容性问题 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 在当今Web开发与设计领域&#xff0c;WebP格式已成为图像优化的黄金标准&am…...

LFM2.5-1.2B-Thinking-GGUFGPU算力:单卡支持4并发+32K上下文稳定推理

LFM2.5-1.2B-Thinking-GGUFGPU算力&#xff1a;单卡支持4并发32K上下文稳定推理 1. 平台概述 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。该模型采用GGUF格式和llama.cpp运行时&#xff0c;提供了简洁易用的单页Web界…...

Linux服务器卡死?5分钟定位hung task与soft lockup的实战技巧

Linux服务器卡死&#xff1f;5分钟定位hung task与soft lockup的实战技巧 凌晨三点&#xff0c;服务器监控突然告警——核心业务节点失去响应。作为运维工程师&#xff0c;这种场景往往意味着不眠之夜。但不同于新手的手足无措&#xff0c;经验丰富的系统管理员知道&#xff1a…...

FireRedASR-AED-L从零部署:无需Python环境,Docker镜像开箱即用指南

FireRedASR-AED-L从零部署&#xff1a;无需Python环境&#xff0c;Docker镜像开箱即用指南 你是否遇到过这样的情况&#xff1f;想用最新的语音识别模型&#xff0c;却被复杂的Python环境、版本冲突和依赖安装搞得焦头烂额。或者好不容易装好了环境&#xff0c;又因为音频格式…...

重度抑郁症多基因风险与大脑结构的关联,一项涵盖50,975名参与者的大型分析,涵盖11项队列

论文总结 这篇论文通过大规模国际合作&#xff0c;整合了11项研究、共50,975名参与者的数据&#xff0c;采用统一的多基因风险评分和神经影像分析流程&#xff0c;发现抑郁症的多基因风险与较低的颅内体积、较小的皮质表面积&#xff08;尤其是额叶和眶额叶区域&#xff09;以…...

智能写作工坊:OpenClaw+Qwen3.5-9B辅助小说创作

智能写作工坊&#xff1a;OpenClawQwen3.5-9B辅助小说创作 1. 为什么需要AI辅助写作&#xff1f; 作为一个业余小说创作者&#xff0c;我长期面临三个核心痛点&#xff1a;世界观设定碎片化、人物关系维护困难和情节发展缺乏新意。传统写作软件如Scrivener虽然提供了素材管理…...

一键解决中文文献管理痛点:茉莉花插件让Zotero效率提升90%的完整指南

一键解决中文文献管理痛点&#xff1a;茉莉花插件让Zotero效率提升90%的完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum …...

OpenClaw备份方案:Qwen3.5-9B模型接口故障时的降级策略

OpenClaw备份方案&#xff1a;Qwen3.5-9B模型接口故障时的降级策略 1. 为什么需要备份方案&#xff1f; 上周我正用OpenClaw处理一批重要文件归档任务时&#xff0c;突然遇到Qwen3.5-9B接口响应超时。当时正在半夜&#xff0c;没有备用方案的我只能眼睁睁看着自动化流程中断&…...

Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统

Java开发者晋升指南&#xff1a;集成Phi-3-vision构建AI面试题库与评估系统 1. 技术招聘的痛点与AI解决方案 技术面试官每天面临重复性劳动&#xff1a;根据JD设计题目、评估代码、写反馈。传统方式存在三大痛点&#xff1a; 题库更新慢&#xff1a;技术栈迭代快&#xff0c…...