如何玩spdlog?
How to play with spdlog?
我下载并按照示例 1.
移至示例 2 (Create stdout/stderr logger object
) 并卡住了。其实我可以 运行 原样,但如果我改变
spdlog::get("console")
到 spdlog::get("err_logger")
它崩溃了。
我应该这样改吗?
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
void stdout_example()
{
// create color multi threaded logger
auto console = spdlog::stdout_color_mt("console");
auto err_logger = spdlog::stderr_color_mt("stderr");
spdlog::get("err_logger")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");
}
int main()
{
stdout_example();
return 0;
}
我也试过Basic file logger
例子:
#include <iostream>
#include "spdlog/sinks/basic_file_sink.h"
void basic_logfile_example()
{
try
{
auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic-log.txt");
}
catch (const spdlog::spdlog_ex &ex)
{
std::cout << "Log init failed: " << ex.what() << std::endl;
}
}
int main()
{
basic_logfile_example();
return 0;
}
我看到它创建了 basic-log.txt
文件,但上面什么也没有。
因为你需要先注册err_logger
记录器。据我所知,没有默认值 err_logger
。 spdlog::get()
returns 基于其注册名称的记录器,而不是变量。
您需要这样的代码。代码很复杂,但您可能不需要全部代码:
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/rotating_file_sink.h"
void multi_sink_example2()
{
spdlog::init_thread_pool(8192, 1);
auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt >();
auto rotating_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("mylog.txt", 1024*1024*10, 3);
std::vector<spdlog::sink_ptr> sinks {stdout_sink, rotating_sink};
auto logger = std::make_shared<spdlog::async_logger>("err_logger", sinks.begin(), sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
spdlog::register_logger(logger); //<-- this line registers logger for spdlog::get
}
在此代码之后,您可以使用 spdlog::get("err_logger")
。
您可以阅读有关创建和注册记录器的内容here。
我认为 spdlog::stderr_color_mt("stderr");
使用名称 stderr
注册记录器,所以 spdlog::get("stderr")
可能有效,但我自己没有测试过。
我下载并按照示例 1.
移至示例 2 (Create stdout/stderr logger object
) 并卡住了。其实我可以 运行 原样,但如果我改变
spdlog::get("console")
到 spdlog::get("err_logger")
它崩溃了。
我应该这样改吗?
#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
void stdout_example()
{
// create color multi threaded logger
auto console = spdlog::stdout_color_mt("console");
auto err_logger = spdlog::stderr_color_mt("stderr");
spdlog::get("err_logger")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");
}
int main()
{
stdout_example();
return 0;
}
我也试过Basic file logger
例子:
#include <iostream>
#include "spdlog/sinks/basic_file_sink.h"
void basic_logfile_example()
{
try
{
auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic-log.txt");
}
catch (const spdlog::spdlog_ex &ex)
{
std::cout << "Log init failed: " << ex.what() << std::endl;
}
}
int main()
{
basic_logfile_example();
return 0;
}
我看到它创建了 basic-log.txt
文件,但上面什么也没有。
因为你需要先注册err_logger
记录器。据我所知,没有默认值 err_logger
。 spdlog::get()
returns 基于其注册名称的记录器,而不是变量。
您需要这样的代码。代码很复杂,但您可能不需要全部代码:
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/rotating_file_sink.h"
void multi_sink_example2()
{
spdlog::init_thread_pool(8192, 1);
auto stdout_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt >();
auto rotating_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("mylog.txt", 1024*1024*10, 3);
std::vector<spdlog::sink_ptr> sinks {stdout_sink, rotating_sink};
auto logger = std::make_shared<spdlog::async_logger>("err_logger", sinks.begin(), sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
spdlog::register_logger(logger); //<-- this line registers logger for spdlog::get
}
在此代码之后,您可以使用 spdlog::get("err_logger")
。
您可以阅读有关创建和注册记录器的内容here。
我认为 spdlog::stderr_color_mt("stderr");
使用名称 stderr
注册记录器,所以 spdlog::get("stderr")
可能有效,但我自己没有测试过。