我已经创建了一个接口文件my_boost_log.h,以及相关的实现文件my_boost_log.cpp
接口文件包含以下几行:
#ifndef MY_BOOST_LOG_H
#define MY_BOOST_LOG_H
#define MY_LOG_DEBUG(logRecord)
BOOST_LOG_SEV(SLogger::get(), boost::log::trivial::debug)
<< "(" << __FILE__ << ", " << __LINE__ << ") " << logRecord;
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
SLogger, boost::log::sources::severity_logger<boost::log::trivial::severity_level>)
void init_library(std::string fileLog);
#endif
其中“fileLog”是将存储记录的文件的名称。 实现文件如下:
#include "my_boost_log.h"
void init_library(std::string fileLog)
{
boost::log::add_file_log(
boost::log::keywords::file_name = logFileName,
boost::log::keywords::rotation_size = 10 * 1024 * 1024,
boost::log::keywords::time_based_rotation =
boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
boost::log::keywords::format = "%TimeStamp% [%Severity%] : %Message%");
auto core = boost::log::core::get();
core->add_global_attribute("TimeStamp", boost::log::attributes::local_clock());
core->add_global_attribute("Process", boost::log::attributes::current_process_name());
core->add_global_attribute("ProcessID", boost::log::attributes::current_process_id());
core->add_global_attribute("ThreadID", boost::log::attributes::current_thread_id());
core->set_filter(boost::log::trivial::severity >= boost::log::trivial::trace);
}
所以基本上每次我使用宏 MY_LOG_DEBUG(logMessage) 时,参数都会存储在以作为参数传递给 init_library() 函数的字符串命名的文件中。 我想测试这段代码。换句话说,我想使用宏 MY_LOG_DEBUG(logMessage) 将消息“logMessage”存储在文件中,然后检索读取文件的相同消息以检查它们是否相等。 为此,我创建了一个名为 test_my_boost_log.cpp 的文件,如下所示:
#include <gtest/gtest.h>
#include "my_boost_log.h"
#include <iostream>
#include <fstream>
class MyLogTest: public ::testing::Test
{
protected:
};
TEST_F(MyLogTest, TestLogRecord)
{
std::fstream logFile;
std::string logMess{"Test debug log\n"};
LOG_INFO(logMess);
logFile.open("test_file.log", std::ios::in);
if (logFile.is_open())
{
std::string fileContent;
while(getline(logFile, fileContent))
{
std::cout << "Content of the file: " << fileContent << std::endl;
}
logFile.close();
}
else
{
std::cout << "Error: cannot open the file" << std::endl;
}
// Remaining part to check if what's inside the file is equal to logMess variable
}
int main(int argc, char** argv)
{
log::init("test_file.log");
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
我的问题是我无法读取文件的内容并将其存储在“fileContent”字符串变量中以进行我需要的检查。 当我尝试打印它时,该字符串是空的。我进行了不同的测试并根据我的理解:
有没有办法在进程终止之前读取文件内容并执行我的测试?
因此,从文件读取没有错误。你只是读得太早了。
您需要做的是刷新日志。这是自动发生的,出于效率目的,最好保持原样。然而,
sink
接口为您提供了手动刷新文件接收器的方法:例如如何手动刷新 boost 日志?
在你的情况下,你正在做一个单元测试,所以我建议在单元测试本地保留一个临时接收器,并在最后关闭它,这样你不需要做任何特殊的事情全部。