一、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();