企业网站可以备案几个,南昌做购物网站的公司,北京建筑人才网,google付费推广#x1f60f;★,:.☆(#xffe3;▽#xffe3;)/$:.★ #x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客#xff0c;一起学习#xff0c;共同进步。 喜欢的朋友可以关注一下★,°:.☆(▽)/$:.°★ 这篇文章主要介绍跨平台轻量日志库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.hINITIALIZE_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 %msgFILENAME /tmp/logs/my.logENABLED 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)输出对应等级的日志。
该项目也在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 eleasylogging.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 --;
}以上。