使用spdlog,如何更改每日记录器的默认滚动时间?
在以下示例中,滚动仅在午夜发生:
auto logger = spd::daily_logger_st("my_logger", "fl_log.txt");
Run Code Online (Sandbox Code Playgroud) 问这个问题我觉得自己像个傻瓜,因为这是我能想到的最简单的例子,但它让我受不了。
我已经实现了一个非常基本的控制台和文件记录器:
auto logger = spdlog::basic_logger_mt("console and file logger", filepath);
#ifdef NDEBUG
spdlog::set_level(spdlog::level::info); // Set global log level to info
#else
spdlog::set_level(spdlog::level::trace); // Set global log level to everything
#endif
spdlog::set_pattern("%^%l: %v%$"); // see https://github.com/gabime/spdlog/wiki/3.-Custom-formatting
spdlog::flush_on(spdlog::level::info);
Run Code Online (Sandbox Code Playgroud)
这以颜色完美地写入控制台,但尽管它创建了日志文件,但它从不写入。
我想尝试手动刷新它,但没有 spdlog::flush。
我最初用两个接收器(一个控制台,一个文件)实现了这个,并且有一个类似的问题:除非在这种情况下它会将第一条(也是唯一的第一条)消息写入日志文件,只要它是一个错误。
很抱歉问这么无聊的问题...
- - - - - - - - - - - - - - - 编辑 - - - - - - - - - - --------------------
尝试 1(来自多接收器示例):
// Creating console logger --------------------
auto …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个名为 spdlog 的库进行日志记录。我想围绕库构建我自己的 Logger,以便我可以选择添加特定于我的应用程序的“额外”功能。
我能够让下面的代码工作:
#include <spdlog/spdlog.h>
int main()
{
spdlog::log(spdlog::level::level_enum::info, "this is an info message");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,日志级别可通过命名空间为 的枚举获得spdlog::level::level_enum
。
我可能会使这个问题过于复杂,但是如果我创建自己的 Logger 类,我是否必须期望使用我的记录器的类在它们的日志记录函数调用中键入整个枚举的命名空间?
我正在执行 spdlog 的最新提交(存在有关 std 输出的问题,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。
我的谷歌测试重定向 std::cout 所以我可以检查存根函数的输出:
class MyTest : public testing::Test
{
protected:
void SetUp() override
{
sbuf = std::cout.rdbuf();
std::cout.rdbuf(buffer.rdbuf());
auto console = spdlog::stdout_color_mt("console");
auto err_logger = spdlog::stderr_color_mt("stderr");
}
void TearDown() override
{
std::cout.rdbuf(sbuf);
}
std::stringstream buffer;
std::streambuf* sbuf;
}
Run Code Online (Sandbox Code Playgroud)
然后在测试中使用如下;
doSomethingThatWritesToStdOut();
std::string teststr = buffer.str();
EXPECT_TRUE(teststr.find("Some output string") != std::string::npos);
Run Code Online (Sandbox Code Playgroud)
doSomethingThatWritesToStdOut
当我将内容更改为时,这不起作用
spdlog::get("console")->debug("Some output string\n");
该teststr
值为空..如果我执行以下操作
spdlog::get("console")->debug("Some output string\n");
std::cout << "Some output string\n";
Run Code Online (Sandbox Code Playgroud)
然后我可以在 teststr.txt 中看到“某些输出字符串”的一个实例。如何捕获此记录器的输出(或更改记录器)以便我可以在谷歌测试中进行测试?
我有一个简单的 CMake 项目,并尝试使用 conan 安装的 spdlog 库(版本 1.5.0)。
但是在构建时出现以下错误:
undefined reference to `spdlog::get(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Run Code Online (Sandbox Code Playgroud)
我不确定问题是否来自我的设置、conan 或 spdlog 库。谁能帮我去哪里看?
我的本地设置:Ubuntu 19.04、QT Creator、Clang 9(在 IDE 和 conan 中)、conan 1.24.0