读取使用 Boost::log 库创建的文件中存储的信息时出错

问题描述 投票:0回答:1

我已经创建了一个接口文件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”字符串变量中以进行我需要的检查。 当我尝试打印它时,该字符串是空的。我进行了不同的测试并根据我的理解:

  • 存储日志的文件是在使用宏时创建的,而不是在调用 init_library() 时创建的;
  • 当进程(主)终止时,消息似乎被存储在文件中(然后文件被关闭);

有没有办法在进程终止之前读取文件内容并执行我的测试?

c++ file boost filestream boost-log
1个回答
0
投票

因此,从文件读取没有错误。你只是读得太早了。

您需要做的是刷新日志。这是自动发生的,出于效率目的,最好保持原样。然而,

sink
接口为您提供了手动刷新文件接收器的方法:例如如何手动刷新 boost 日志?

在你的情况下,你正在做一个单元测试,所以我建议在单元测试本地保留一个临时接收器,并在最后关闭它,这样你不需要做任何特殊的事情全部。

© www.soinside.com 2019 - 2024. All rights reserved.