qt中使用spdlog
github:https://github.com/gabime/spdlog
环境安装方式
Package managers:
Debian: sudo apt install libspdlog-dev
Homebrew: brew install spdlog
MacPorts: sudo port install spdlog
FreeBSD: pkg install spdlog
Fedora: dnf install spdlog
Gentoo: emerge dev-libs/spdlog
Arch Linux: pacman -S spdlog
openSUSE: sudo zypper in spdlog-devel
vcpkg: vcpkg install spdlog
conan: spdlog/[>=1.4.1]
conda: conda install -c conda-forge spdlog
build2: depends: spdlog ^1.8.2
编译安装
git clone https://github.com/gabime/spdlog.git
cd spdlog && mkdir build && cd build
cmake .. && make -j
#指定安装目录
cmake -DCMAKE_INSTALL_PREFIX=/path .. && make -j && make install
#默认只编译静态库,开启同时编译动态库
cmake -DCMAKE_INSTALL_PREFIX=/path -DSPDLOG_BUILD_SHARED=ON -DSPDLOG_BUILD_PIC=ON .. && make -j && make install
#有很多编译选项 看CMakeList.txt 中的option
交叉编译(指定编译器方式)
修改CMakeList.txt
更具自己的编译器选择
set(CMAKE_C_COMPILER /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++)
通过cmake 引入项目
#包管理的方式安装的不用设置这个变量
set(spdlog_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/spdlog/lib/cmake/spdlog")
find_package(spdlog REQUIRED)
#链接库
target_link_libraries(xxxx spdlog::spdlog $<$<BOOL:${MINGW}>:ws2_32>)
官方文档链接:https://github.com/gabime/spdlog/wiki/4.-Sinks
日志同时输出文件和qt控件QTextBrowser,QTextEdit…
介绍:
mt 和 st 是两种不同的 sink 后缀,表示不同的多线程支持模式
mt 代表多线程(Multi-threading)模式。使用具有多线程支持的版本的 sink 可以在多个线程中同时安全地写入日志。这些多线程 sink 使用了互斥锁(mutex)等机制来确保并发写入时的线程安全性。例如,basic_file_sink_mt 是支持多线程的基本文件 sink。
st 代表单线程(Single-threading)模式。单线程 sink 适用于单线程环境,不进行任何线程安全处理。在多线程环境下使用单线程 sink 可能会导致竞态条件和不确定行为。例如,basic_file_sink_st 是单线程的基本文件 sink。
代码
#include <spdlog/sinks/qt_sinks.h>
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/spdlog.h>
//LOGGER_SAVE_PATH日志文件
//每天00:00更新日志文件
auto fileSink = std::make_shared<spdlog::sinks::daily_file_sink_mt>(LOGGER_SAVE_PATH, 0, 0);
//ui->textBrowser 指定一个显示日志的textBrowser或者textEdit控件
//第二次参数是方法
auto qtSink = std::make_shared<spdlog::sinks::qt_sink_mt>(ui->textBrowser, "append");
auto logger = std::make_shared<spdlog::logger>("logger", spdlog::sinks_init_list{fileSink, qtSink});
logger->set_level(spdlog::level::debug);
//设置 logger 在达到指定级别(这里是 debug)时进行刷新操作,不等待缓冲区满或程序结束
logger->flush_on(spdlog::level::debug);
logger->info("qt logger and file logger");