介绍
nanolog 是一个C++的日志库,其亮点如下
-
字符串文字的零复制:
nanolog 设计了零复制的字符串文字处理机制。这意味着在记录日志时,nanolog 不会复制字符串文字的内容,而是直接引用它们。这有助于减少内存的使用,因为字符串文字不需要额外的复制。 -
整数和双精度数到 ASCII 的延迟转换:
nanolog 对整数和双精度数的转换进行了延迟处理。这意味着当你记录一个包含整数或双精度数的日志时,nanolog 不会立即将它们转换为 ASCII,而是延迟到真正需要输出日志时才进行转换。这种延迟转换可以提高性能,并减少不必要的计算开销。 -
没有为小于 256 字节的日志行分配堆内存:
nanolog 避免了为小于 256 字节的日志行分配堆内存。对于较小的日志行,nanolog 使用栈上的内存而不是堆内存,以减少内存管理的开销。这有助于提高性能并减小内存碎片化的可能性。 -
简约的标题包括:
nanolog 设计了简约的标题包括机制,避免了仅头文件库的常见模式。这有助于减少项目的编译时间,因为不需要频繁包含大量头文件。通过设计简约的标题包括,nanolog 可以更有效地嵌入到项目中,减少不必要的重新编译。
有保证和无保证的日志记录
- Nanolog 支持保证日志记录Guaranteed,即即使在极端的日志记录速率下,日志消息也不会被丢弃。
- Nanolog 还支持非保证日志记录Non Guaranteed。使用环形缓冲区来保存日志行。如果环已满,日志记录速率极高(即消费者线程无法足够快地弹出项目),则槽中的前一个日志行将被删除。即使环形缓冲区已满,也不会阻止生产者。
用法:
-
初始化 nanolog:
在使用 nanolog 之前,你需要初始化它。通常在程序的初始化阶段执行。#include "nanolog/nanolog.hpp" #include <iostream> int main() { nanolog::initialize(nanolog::GuaranteedLogger(), "./log/", "nanolog", 1); // 其他初始化代码... return 0; }
这里使用
nanolog::initialize
初始化 nanolog,指定了日志文件的存储路径、文件名前缀和滚动大小。 -
记录日志:
nanolog 提供了几个宏用于记录日志,例如LOG_INFO
,LOG_WARN
,LOG_ERROR
等。LOG_INFO << "This is an informational message"; LOG_WARN << "This is a warning message"; LOG_ERROR << "This is an error message";
nanolog 的日志语法采用流式风格,类似于
std::cout
。 -
支持格式化输出:
nanolog 也支持格式化输出,使用%
占位符。LOG_INFO << "Formatted message with value: " << 42 << ", and float: " << 3.14;
这样的记录将被转换成相应的字符串形式。
-
性能和零复制特性:
nanolog 的性能和零复制特性是其亮点之一。通过避免复制字符串文字、延迟转换和栈内存分配,nanolog 实现了高效的日志记录。 -
定制日志格式:
nanolog 允许你定制日志的输出格式,包括时间戳格式、线程ID 等。nanolog::initialize(nanolog::GuaranteedLogger(), "./log/", "nanolog", 1); nanolog::set_log_format("[%nanolog%] [%date% %time%] [%log_level%] [%file%:%line%] %message%");
这里通过
set_log_format
定义了日志的输出格式。