您的位置:

使用spdlog轻松高效地记录日志

一、plsql使用odbc导入器

在进行日志记录时,通常需要将日志保存在文件中或者将其存储在数据库中。而当需要将日志存储在Oracle数据库中时,可以使用plsql开发工具并使用odbc导入器。

begin 
     insert into Logtable values ('DEBUG', '2022-1-1 12:30:00', 'this is a debug log');
end;

二、spdlog优缺点

spdlog是一个高速且灵活的C++日志记录库,可以进行多线程支持、异步记录、日志回滚等。

优点:

  • 速度非常快
  • 提供了多种输出方式
  • 支持多线程
  • 易于使用

缺点:

  • 不支持跨平台
  • 可能不适合所有的项目需要

三、spdlog 多线程

spdlog支持多线程记录日志,可以让多个线程同时进行记录,避免了线程阻塞的问题。

// 创建并设置logger对象
auto console = spdlog::stdout_color_mt("console");
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/spdlog.txt");

// 多线程记录日志
std::thread t1([](){
    console->info("This is thread 1.");
});
std::thread t2([](){
    console->info("This is thread 2.");
});

t1.join();
t2.join();

四、spdlog库

使用spdlog,我们可以方便地进行日志记录、管理和输出。

如何使用spdlog?

在使用spdlog之前,需要先安装spdlog库,在CMakeLists.txt中添加以下代码:

# 添加spdlog库
include(FetchContent)

FetchContent_Declare(
    spdlog
    GIT_REPOSITORY https://github.com/gabime/spdlog.git
    GIT_TAG        v1.9.2
)

FetchContent_GetProperties(spdlog)
if(NOT spdlog_POPULATED)
  FetchContent_Populate(spdlog)
  add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

然后在C++代码中使用spdlog库。

// 创建一个logger对象
auto console = spdlog::stdout_color_mt("console");

// 记录日志到console
console->info("This is a console log.");

五、spdlog sink

使用spdlog时,可以将日志记录到多个输出位置,称为sink。spdlog支持多种sink,如文件、控制台、网络等。

如何使用sink?

// 添加控制台sink
auto console_sink = std::make_shared<spdlog::sinks::stdout_sink_mt>();
auto console_logger = std::make_shared<spdlog::logger>("console", console_sink);

// 添加文件sink
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/spdlog.txt", true);
auto file_logger = std::make_shared<spdlog::logger>("file_logger", file_sink);

六、spdlog flush

当使用spdlog进行日志记录时,有时候需要手动将缓存中的日志刷进磁盘,可以使用flush函数来完成此操作。

// 记录日志并刷进磁盘
console->info("This is a console log.");
console->flush();

七、spdlog utf8

spdlog支持UTF-8编码的日志记录,并提供了多种输出编码方式。

// 记录UTF-8编码的日志并以UTF-16LE编码输出
auto utf16_sink = std::make_shared<spdlog::sinks::wincolor_stdout_sink_st<spdlog::details::null_mutex>>();
utf16_sink->set_encoding(spdlog::sinks::wincolor_sink_base::encoding_type::utf16);

auto utf16_logger = std::make_shared<spdlog::logger>("utf16_logger", utf16_sink);
utf16_logger->info(u8"This is a UTF-8 log.");
utf16_logger->flush();