0 资料
1 spdlog
1.1 简介
spdlog是一个用C++11编写的高性能日志库,优点:
- 高性能
- 用法类似python的logging
1.2 安装
- git clone https://github.com/gabime/spdlog.git
- cd spdlog
- mkdir build
- cd build
- cmake ...
- make
- vim main.cpp,填入以下测试代码
plain
#include "spdlog/spdlog.h"
int main() {
//Use the default logger (stdout, multi-threaded, colored)
spdlog::info("hello spd");
spdlog::info("hello {}, {}", "shuo", 29);
return 0;
}
- 保存并退出,其文件目录如下
plain
$ tree -L 2
.
|-- main.cpp
`-- spdlog
|-- include
- 编译测试代码(注意要用C++11的标准)
- g++ --std=c++11 -I spdlog/include main.cpp
1.3 使用
1.3.1 基本使用
plain
#include <iostream>
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h" //支持输出到标准终端
#include "spdlog/sinks/basic_file_sink.h" // 支持保存到基础文档
#include "spdlog/sinks/rotating_file_sink.h" // 支持保存成滚动文档
int main(int, char* [])
{
try
{
// 1、将日志打印到标准输出中
auto console = spdlog::stdout_color_mt("console");
console->set_level(spdlog::level::warn); //设置日志记录器的输出日志等级
console->info("Welcome to spdlog");
// 2、将日志保存到文本中 (not rotated)
auto my_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
my_logger->info("hello");
// 3、将文字保存到一个迭代的文本中,改文本最大5M,最多有3个文本
auto file_logger = spdlog::rotating_logger_mt("file_logger", "myfilename", 1024 * 1024 * 5, 3);
file_logger->info("hello file");
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
1.3.2 多个日志记录器共享一个日志文件
plain
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/spdlog.h"
#include <iostream>
int main(int, char *[]) {
// 设置文件异步共享终端
auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>("logfile", 23, 59);
// 创建日志异步发生器
auto net_logger = std::make_shared<spdlog::logger>("net", daily_sink);
auto hw_logger = std::make_shared<spdlog::logger>("hw", daily_sink);
// 设置各个发生器的日志等级 (error, warn, info, debug)
net_logger->set_level(spdlog::level::info);
hw_logger->set_level(spdlog::level::debug);
// 全局登记发生器,使之能使用spdlog::get(logger_name)的方式在其他地方被获取
spdlog::register_logger(net_logger);
net_logger->info("hello net_logger");
hw_logger->info("hello hw_logger");
}
1.3.3 通过spdlog::get("...")来访问一个已经创建的logger
spdlog对于每个线程,都维护着一个全局的日志发生器,所有日志发生器在产生的时候都会被自动注册。在程序的其他地方,可以使用** auto 指针 = spdlog::get(日志发生器名称 );来获取改日志发生器的指针。如果该日志发生器不存在,则会返回空指针。因此,可以使用if(指针)**来判断是否有该日志发生器。
plain
class logger_get
{
private:
std::shared_ptr<spdlog::logger> _logger = spdlog::get("console");
public:
void print_hello()
{
_logger->info("helloworld");
return;
}
};
然后在main函数中试着调用这个类
plain
int main(int, char* [])
{
...
logger_get test;
test.print_hello();
}