我正在尝试使用google test执行测试时在文本文件中记录基本信息。 我的最终目标是记录异常的跟踪。
在项目中,我使用的是C++ 11,它是通过CMake和spdlog仅作为 header 添加到项目中的最新Google测试版本(已添加到libs中的项目中)。
由于某种原因,即使试图强制刷新,记录器也不会写入文件。我尝试了互联网上的其他“快速入门”,但没有任何帮助。我不认为这可能是一个问题,但是一个假设是,您不能在测试的上下文中写入文件。该项目的结构如下:
.
|
├── build
├── cmake
├── libs
| ├── ...
| └── spdlog (*)
├── src
| ├── ...
| ├── main.cpp
| └── CMakeLists.txt
├── test
| ├── ...
| ├── CMakeLists.txt
| └── core
| └── logging
| ├── log
| | └── logger.txt
| └── logging_test.cpp
├── ...
└── CMakeLists.txt
目录中的(*)文件是spdlog / include / spdlog https://github.com/gabime/spdlog/tree/v1.x/include/spdlog中的文件
这是测试类
logging_test.cpp
中的代码。运行测试check_exception_thrown_equal
后,尚未将任何内容写入logger.txt
。可能是什么问题?#include <exception>
#include "gtest/gtest.h"
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
class LoggingTest: public testing::Test {
protected:
std::shared_ptr<spdlog::logger> logger;
struct ExceptionTemplate : std::exception {
const char* what() { return "ExceptionTemplate triggered!"; }
};
// create logger
void create_logger() {
// Create basic file logger (not rotated)
logger = spdlog::basic_logger_mt("logger", "log/logger.txt");
}
// setup logger configurations
void set_up() {
logger->set_level(spdlog::level::info);
logger->flush_on(spdlog::level::info);
logger->info("Debug logger setup done. \n");
}
// critical method that generates and returns my exception of type ExceptionTemplate
ExceptionTemplate exception_generator() {
try {
///////////////////////////////
// call to critical method here
///////////////////////////////
throw ExceptionTemplate();
}
catch (ExceptionTemplate &e) {
log_exception(e);
return e;
}
}
// write to logger
void log_exception(ExceptionTemplate e) {
try {
LoggingTest::create_logger();
LoggingTest::set_up();
logger->info("Exception raised! {}", e.what());
}
catch (const spdlog::spdlog_ex &ex) {
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
};
TEST_F(LoggingTest, check_exception_thrown_equal) {
ASSERT_STREQ(LoggingTest::exception_generator().what(), "ExceptionTemplate triggered!");
}
最佳答案
尝试使用一个更简单的设置,您不需要所有的“helper”功能等等,也不需要一开始就与异常相关的东西。只需在调用类的构造函数时记录一条消息即可。
class LoggingTest {
LoggingTest() {
auto logger = spdlog::basic_logger_mt("test_logger", "logs/test.txt");
spdlog::set_default_logger(logger);
spdlog::flush_on(spdlog::level::info);
spdlog::get("test_logger")->info("LoggingTest::ctor");
}
}
然后只需在
main
(或其他任何地方)中创建该类的实例。确保目录存在并且可写(尽管此使用情况会导致错误,而不是无提示的失败)。