使用spdlog(C ++)进行记录,记录器未将日志写入文件

时间:2019-11-24 11:26:03

标签: c++ googletest spdlog

我正在尝试通过google test执行测试时将基本信息记录在文本文件中。我的最终目标是记录异常的踪迹。

在项目中,我使用的是C ++ 11,它是通过CMake和spdlog仅作为标头(已添加到libs中的项目中)添加到项目中的最新Google测试版本。

由于某种原因,即使试图强制刷新,记录器也不会写入文件。我曾尝试过通过互联网进行其他“快速入门”,但没有任何工作对我有用。我不认为这可能是个问题,但是一个假设是,您不能在测试的上下文中写入文件。该项目的结构如下:

.
|
├── 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!");
}

1 个答案:

答案 0 :(得分:1)

尝试使用更简单的设置,您不需要所有的“ 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(或其他任何地方)中创建该类的实例。确保目录存在并且可写(尽管此使用情况会导致错误,而不是无提示的失败)。

相关问题